1 Firing rate of IL neurons during glycinergic fiber activation

In these experiments glycinergic fibers were photactivated while the firing rate of individual IL neurons was recorded. Some of the IL cells had very low baseline activity. In order to increase the firing rate of the IL neurons and to detect the effect of the glycinergic fiber activation a small tail pinch was applied. The firing rate of the recorded IL cells decreased during the glycinergic fiber activation.

1.1 Loading data

Loading AP and stimuli times from stimulus and from baseline data to IL_stim_firing and to IL_baseline_firing tables:

IL_stim_firing <- CreateRecTibble(AP_times = read_csv(file.path("data", 
    "IL_MFR", "stimulus", "AP_times.csv")), 
    stim_times = read_csv(file.path("data", 
        "IL_MFR", "stimulus", "stim_times.csv")))
IL_stim_firing %>% head()
IL_baseline_firing <- CreateRecTibble(
  AP_times = read_csv(file.path("data", "IL_MFR", "baseline", "AP_times.csv")),
  stim_times = read_csv(file.path("data", "IL_MFR", "baseline", "stim_times.csv"))
)
IL_stim_firing %>% head()



1.2 Summary information

Summary information of the stimulus and baseline recording files:

  • Variables:
    • file names (file_name)
    • number of channels in the raw recording files (No_ch)
    • number of APs (No_AP_unit, No_AP_unit2)
    • number of stimulus trains (No_Stim)
    • LFP sampling rate (samp_rate_lfp)
    • unit sampling rate (samp_rate_unit)
    • length of the recording (rec_length)
    • length of the stimulus trains (No_trains)
    • Are the lengths of the stimulus trains equal in the recording (train_length_equal)
    • starting time of the stimulus trains (train_start)
    • ending time of the stimulus trains (train_end)



CELL_INFO table to store the cell categories. It was created manually using the information from the summary excel table (Glicy_juxta-fm_exp_records_injection_sum.xls)

  • Variables
    • cell identification (cell_id). To find the recording file use the summary excel table
    • file names (file_name)
    • spontaneously active cells (bl_activity)
    • induced firing (pinch)
    • individually identified neurons (ident)
    • control cells (control)



1.3 Calculations

1.3.1 Firing rates

b_d_a_MFR: Calculating the number of APs -using a custom made function (BDACalculator)- before during and after the stimulus trains (b_d_a_MFR).

b_d_a_MFR <- lapply(CELL_INFO$cell_id, BDACalculator, data = IL_stim_firing) %>%
  bind_rows() %>%
  dplyr::mutate(FR = No_AP / train_length) %>%
  dplyr::group_by(stim_cond, cell_id) %>%
  dplyr::summarise(MFR = mean(FR))


sd_mean_isi: Calculating the baseline MFR of the recorded IL cells from the IL_baseline_firing table using a custom made function (SDMeanISI). The results are stored in the sd_mean_isi table.


1.3.2 Ranks (strength of inhibition)

cellranks: Calculating ranks based on the activity change from “baseline” to “during stimulus”. If the activity change is negative (decreased MFR) the asigned rank is negative, if it is positive (increased MFR) the assigned rank is positive.


Calculating the firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to baseline:




\[\mathbf{activity\_change} = \frac{during\_MFR - base\_MFR}{base\_MFR} * 100\]

cellranks <- b_d_a_MFR %>%
  dplyr::group_by(stim_cond) %>%
  dplyr::mutate(base_MFR = sd_mean_isi$MFR) %>%
  dplyr::mutate(activity_change = ((MFR - base_MFR) / base_MFR * 100) %>% round(2)) %>%
  dplyr::filter(stim_cond == "d") %>%
  dplyr::mutate(change_rank = ifelse(activity_change > 0,
    rank(activity_change),
    -rank(-activity_change)
  )) %>%
  ungroup() %>%
  left_join(CELL_INFO %>%
    select(cell_id, control, pinch, position),
  by = "cell_id"
  )
cellranks

cellranks_before_stim: Calculating ranks based on the activity change from “before stimulus” to “during stimulus”. If the activity change is negative (decreased MFR) the asigned rank is negative, if it is positive (increased MFR) the assigned rank is positive.


Calculating the firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to before stimulus:




\[\mathbf{activity\_change} = \frac{during\_MFR - before\_MFR}{before\_MFR} * 100\]

cellranks_before_stim <- b_d_a_MFR %>%
  spread(key = stim_cond, value = MFR) %>%
  dplyr::mutate(activity_change = ((d - b) / b * 100) %>% round(2)) %>%
  dplyr::mutate(change_rank = ifelse(activity_change > 0,
    rank(activity_change),
    -rank(-activity_change)
  )) %>%
  left_join(CELL_INFO %>%
    select(cell_id, control, pinch, position),
  by = "cell_id"
  )
cellranks_before_stim



1.3.3 Data to plot

TO_PLOT: Combining b_d_a_MFR (firing rate of 29 IL neurons b/d/a stim) with sd_mean_isi table (baseline firing rate of the same 29 neurons), joining with CELL_INFO containing important information of the cells (baseline activity, identified, pinched, control) and with cellranks containing the ranks asigned to each cells based on the changes in MFR during the stimulus compared to baseline.

TO_PLOT <- bind_rows(
  sd_mean_isi %>%
    select(MFR, cell_id, stim_cond),
  b_d_a_MFR
) %>%
  left_join(CELL_INFO %>%
    select(-file_name),
  by = "cell_id"
  ) %>%
  left_join(cellranks %>%
    select(cell_id, change_rank, activity_change),
  by = "cell_id"
  )

datatable(TO_PLOT,
  caption = "TO_PLOT table",
  rownames = TRUE,
  options = list(pageLength = 50, scrollX = T, scrollY = "500px", dom = "t")
)



1.4 Plotting

1.4.1 Baseline vs. “before” stimulus activity

Comparison of baseline and “before” stimulus firing rates in the case of spontaneously active and sponteneously inactive (pinch) neurons. Spontaneously inactive neurons showed significantly higher MFR before stiulus compared to baseline.



1.4.2 MFR before, during and after stimulus



1.4.3 Strength of inhibition

Firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to baseline:



Firing rate change during stimulus (photoactivation of the glycinergic fibers) compared to before stimulus:



Plotting the change in MFR from “baseline” to “during stimulus”. Coloring based on the strength of the inhibition (rank)













2 Activity of PRF glycinergic cells during PFC photoactivation

2.1 Loading and transforming (hidden code) data

source(file.path("supplementary_functions", "CreateRecTibble.R"))
RECORDINGS <- CreateRecTibble(
  AP_times = read_csv(file.path("data", "cortical_stim", "AP_times.csv")),
  stim_times = read_csv(file.path("data", "cortical_stim", "stim_times.csv"))
)

STIM_RESULTS <- read_csv(file.path("output_data", "cortical_stim_analysis.csv"))
  • List of tibbles used to store data:
    • RECORDINGS tibble: stores AP and stim time stamps, number of stimuli in each train, stimulus frequency categories (eg. 8 10 and 12 Hz belong to 10 Hz category)
    • STIM_RESULTS: stores the data for PSTHs (CAREFUL WITH THIS!! It’s generated by the “CreatePSTHTibble” function but the frequencies have to be changed manually, and it can create duplicates! I have to work on that! If something doesn’t look right on PSTHs or response probability plots, check this one first)
    • hist_stats: stores PSTH statistics calculated from ggplot
    • RESP_PROB: response probability and latency data calculated from stim results and recordings
    • APC: number of APs after each stimulus in a 50 ms window

2.2 Plotting

2.2.1 Distribution of frist APs after cortical activation

2.2.2 PSTH @ 1 Hz cortical activation

2.2.3 PSTH @ 10 Hz cortical activation

2.2.4 PSTH @ 20 Hz cortical activation

2.2.5 Response probability and latency

2.2.6 Number of APs after each stimulus in stimulus trains (50 ms window)

3 Spontaneous desynchronization of the FC slow oscillation

3.1 Loading data

Loading mat files to file_list object

Content of mat files:

  • AP channel
    • title: channel name
    • comment: notes about the channel
    • resolution: 2.5e-06
    • interval: time between two data points in sec (5e-05)
    • scale: scaling factor (y scale), real = (data * scale) + offset
    • offset: scale offset
    • units: unit of the channel (volt)
    • length: number of APs
    • items: No. points easch AP is represented by
    • trigger:
    • traces:
    • times: times of the APs (first data point of the waveform)
    • codes: marker codes of the APs
    • values: matrix containing the waveforms of the APs (described by a given No. points)
  • EEG channel
    • title: channel name
    • comment:
    • interval:
    • scale: scaling factor (y scale), real = (data * scale) + offset
    • offset: scale offset
    • units:
    • start:
    • length:
    • values:
file_to_load <- file_list[[1]]
filename <- as.character(substring(file_to_load, 1, nchar(file_to_load) - 4))
raw.rec <- readMat(file.path("data", file_to_load))

### takes the first AP (first row) and tells the index of point with the max value
points_to_peak <- which(raw.rec$ap[, , 1]$values[1, ] ==
  max(raw.rec$ap[, , 1]$values[1, ])) %>%
  as.numeric()

### time of the peak of the APs after its first point
raw.rec$ap[, , 1]$interval * points_to_peak
        [,1]
[1,] 0.00055
ap <- raw.rec$ap[, , 1]$times %>% as.double()
ap_peaks <- tibble(peak_times = (ap + c(raw.rec$ap[, , 1]$interval * points_to_peak)))

——- insert code here ——–

(spont_desynchron_analysis.R), 7 recordings

4 Terminals

4.1 Loading data

file_path <- file.path("data", 
    "Emi_terminals", "terminal_measures.csv")
TERMINALS <- read.table(file = file_path, 
    sep = ";", header = T, na.string = "na")
head(TERMINALS)

4.2 Bouton area on different dendritic domains

4.3 Area of boutons with m2 and unknown origin

LS0tDQp0aXRsZTogIkZyb250YWwgY29ydGV4LWRyaXZlbiBnbHljaW5lcmdpYyBpbmhpYml0aW9uIG9mIHRoZSBpbnRyYWxhbWluYXIgdGhhbGFtdXMiDQphdXRob3I6ICJWaWt0b3IgUGxhdHRuZXIsIEVtaWxpYSBCb3N6LCBMYXN6bG8gQWNzYWR5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIGtlZXBfdGV4OiB0cnVlDQogIGh0bWxfbm90ZWJvb2s6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQpzcGFjaW5nOiBzaW5nbGUNCmZvbnRzaXplOiAxMnB0DQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KDQoNCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KYm9keXsgLyogTm9ybWFsICAqLw0KICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgZm9udC1mYW1pbHk6ICJBcmlhbCIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgfQ0KdGQgeyAgLyogVGFibGUgICovDQogIGZvbnQtc2l6ZTogMTJweDsNCn0NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAzOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzRkNGU0ZjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgKi8NCiAgZm9udC1zaXplOiAyOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgyIHsgLyogSGVhZGVyIDIgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmgzIHsgLyogSGVhZGVyIDMgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIkFyaWFsIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzJjM2EzZTsNCn0NCmNvZGUucnsgLyogQ29kZSBibG9jayAqLw0KICAgIGZvbnQtc2l6ZTogMTJweDsNCn0NCnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KfQ0KPC9zdHlsZT4NCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShSLm1hdGxhYikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoc3R5bGVyKQ0KbGlicmFyeShmb3JtYXRSKQ0KDQpsaWJyYXJ5KGJzcGVjKSAjIyMgcG93ZXIgc3BlY3RydW0NCmxpYnJhcnkoV2F2ZWxldENvbXApICMjIyB3YXZlbGV0DQpsaWJyYXJ5KGRpcHRlc3QpICMjIyB0byB0ZXN0IGRpc3RyaWJ1dGlvbiB1bmkvbXVsdGltb2RhbGl0eSAoSVNJKQ0KbGlicmFyeShleGFjdFJhbmtUZXN0cykgIyMjIHdpbGNveC50ZXN0IGZvciB0aWVzDQpsaWJyYXJ5KFdhdmVsZXRDb21wKSAjIyMgd2F2ZWxldA0KbGlicmFyeShzaWduYWwpDQoNCmxpYnJhcnkoU1RBUikNCmxpYnJhcnkoc2VlKSAjIGZvciBoYWxmIHZpb2xpbnBsb3QNCmxpYnJhcnkoZ2doYWx2ZXMpICMgZm9yIGhhbGYgdmlvbGlucGxvdA0KDQpzb3VyY2UoZmlsZS5wYXRoKCJzdXBwbGVtZW50YXJ5X2Z1bmN0aW9ucyIsICJDcmVhdGVSZWNUaWJibGUuUiIpKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQodGlkeSA9IFRSVUUsIHRpZHkub3B0cyA9IGxpc3Qod2lkdGguY3V0b2ZmID0gMzApKQ0KYGBgDQoNCg0KPGJyPjxicj4NCg0KDQoNCiMgRmlyaW5nIHJhdGUgb2YgSUwgbmV1cm9ucyBkdXJpbmcgZ2x5Y2luZXJnaWMgZmliZXIgYWN0aXZhdGlvbg0KDQpJbiB0aGVzZSBleHBlcmltZW50cyBnbHljaW5lcmdpYyBmaWJlcnMgd2VyZSBwaG90YWN0aXZhdGVkIHdoaWxlIHRoZSBmaXJpbmcgcmF0ZSBvZiBpbmRpdmlkdWFsIElMIG5ldXJvbnMgd2FzIHJlY29yZGVkLiBTb21lIG9mIHRoZSBJTCBjZWxscyBoYWQgdmVyeSBsb3cgYmFzZWxpbmUgYWN0aXZpdHkuIEluIG9yZGVyIHRvIGluY3JlYXNlIHRoZSBmaXJpbmcgcmF0ZSBvZiB0aGUgSUwgbmV1cm9ucyBhbmQgdG8gZGV0ZWN0IHRoZSBlZmZlY3Qgb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVyIGFjdGl2YXRpb24gYSBzbWFsbCB0YWlsIHBpbmNoIHdhcyBhcHBsaWVkLiBUaGUgZmlyaW5nIHJhdGUgb2YgdGhlIHJlY29yZGVkIElMIGNlbGxzIGRlY3JlYXNlZCBkdXJpbmcgdGhlIGdseWNpbmVyZ2ljIGZpYmVyIGFjdGl2YXRpb24uIA0KDQoNCiMjIExvYWRpbmcgZGF0YQ0KDQoNCkxvYWRpbmcgQVAgYW5kIHN0aW11bGkgdGltZXMgZnJvbSAqc3RpbXVsdXMqIGFuZCBmcm9tICpiYXNlbGluZSogZGF0YSB0byAqKklMX3N0aW1fZmlyaW5nKiogYW5kIHRvICoqSUxfYmFzZWxpbmVfZmlyaW5nKiogdGFibGVzOg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KSUxfc3RpbV9maXJpbmcgPC0gQ3JlYXRlUmVjVGliYmxlKA0KICBBUF90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAic3RpbXVsdXMiLCAiQVBfdGltZXMuY3N2IikpLA0KICBzdGltX3RpbWVzID0gcmVhZF9jc3YoZmlsZS5wYXRoKCJkYXRhIiwgIklMX01GUiIsICJzdGltdWx1cyIsICJzdGltX3RpbWVzLmNzdiIpKQ0KKQ0KSUxfc3RpbV9maXJpbmcgJT4lIGhlYWQoKQ0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KSUxfYmFzZWxpbmVfZmlyaW5nIDwtIENyZWF0ZVJlY1RpYmJsZSgNCiAgQVBfdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgImJhc2VsaW5lIiwgIkFQX3RpbWVzLmNzdiIpKSwNCiAgc3RpbV90aW1lcyA9IHJlYWRfY3N2KGZpbGUucGF0aCgiZGF0YSIsICJJTF9NRlIiLCAiYmFzZWxpbmUiLCAic3RpbV90aW1lcy5jc3YiKSkNCikNCklMX3N0aW1fZmlyaW5nICU+JSBoZWFkKCkNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyBTdW1tYXJ5IGluZm9ybWF0aW9uIA0KDQpTdW1tYXJ5IGluZm9ybWF0aW9uIG9mIHRoZSAqc3RpbXVsdXMqIGFuZCAgKmJhc2VsaW5lKiByZWNvcmRpbmcgZmlsZXM6DQoNCiogVmFyaWFibGVzOg0KICArIGZpbGUgbmFtZXMgKCpmaWxlX25hbWUqKQ0KICArIG51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgcmF3IHJlY29yZGluZyBmaWxlcyAoKk5vX2NoKikNCiAgKyBudW1iZXIgb2YgQVBzICgqTm9fQVBfdW5pdCosICpOb19BUF91bml0MiopDQogICsgbnVtYmVyIG9mIHN0aW11bHVzIHRyYWlucyAoKk5vX1N0aW0qKQ0KICArIExGUCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX2xmcCopDQogICsgdW5pdCBzYW1wbGluZyByYXRlICgqc2FtcF9yYXRlX3VuaXQqKQ0KICArIGxlbmd0aCBvZiB0aGUgcmVjb3JkaW5nICgqcmVjX2xlbmd0aCopDQogICsgbGVuZ3RoIG9mIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpOb190cmFpbnMqKQ0KICArIEFyZSB0aGUgbGVuZ3RocyBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zIGVxdWFsIGluIHRoZSByZWNvcmRpbmcgKCp0cmFpbl9sZW5ndGhfZXF1YWwqKQ0KICArIHN0YXJ0aW5nIHRpbWUgb2YgdGhlIHN0aW11bHVzIHRyYWlucyAoKnRyYWluX3N0YXJ0KikNCiAgKyBlbmRpbmcgdGltZSBvZiB0aGUgc3RpbXVsdXMgdHJhaW5zICgqdHJhaW5fZW5kKikNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRSB9DQoNCmluZm9fc3RpbSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgInN0aW11bHVzIiwgImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX3N0aW0sDQogIGNhcHRpb24gPSAiU3VtbWFyeSB0YWJsZSBvZiB0aGUgc3RpbXVsdXMgcmVjb3JkaW5nIGZpbGVzIChpbmZvX3N0aW0pIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCjxicj4NCg0KYGBge3IsbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQ0KaW5mb19iYXNlbGluZSA8LSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiSUxfTUZSIiwgImJhc2VsaW5lIiwgImZpbGVfaW5mby5jc3YiKSkNCmRhdGF0YWJsZShpbmZvX2Jhc2VsaW5lLA0KICBjYXB0aW9uID0gIlN1bW1hcnkgdGFibGUgb2YgdGhlIGJhc2VsaW5lIHJlY29yZGluZyBmaWxlcyAoaW5mb19iYXNlbGluZSkiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCjxicj4NCg0KKipDRUxMX0lORk8qKiB0YWJsZSB0byBzdG9yZSB0aGUgY2VsbCBjYXRlZ29yaWVzLiBJdCB3YXMgY3JlYXRlZCBtYW51YWxseSB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3VtbWFyeSBleGNlbCB0YWJsZSAoKkdsaWN5X2p1eHRhLWZtX2V4cF9yZWNvcmRzX2luamVjdGlvbl9zdW0ueGxzKikNCg0KKiBWYXJpYWJsZXMNCiAgKyBjZWxsIGlkZW50aWZpY2F0aW9uICgqY2VsbF9pZCopLiBUbyBmaW5kIHRoZSByZWNvcmRpbmcgZmlsZSB1c2UgdGhlIHN1bW1hcnkgZXhjZWwgdGFibGUNCiAgKyBmaWxlIG5hbWVzICgqZmlsZV9uYW1lKikNCiAgKyBzcG9udGFuZW91c2x5IGFjdGl2ZSBjZWxscyAoKmJsX2FjdGl2aXR5KikNCiAgKyBpbmR1Y2VkIGZpcmluZyAoKnBpbmNoKikNCiAgKyBpbmRpdmlkdWFsbHkgaWRlbnRpZmllZCBuZXVyb25zICgqaWRlbnQqKQ0KICArIGNvbnRyb2wgY2VsbHMgKCpjb250cm9sKikNCg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMjIyBDRUxMIElORk8gdG8gc3RvcmUgY2F0ZWdvcmllcyAoc3BvbnRhbmVvdXNseSBhY3RpdmUsIGluZHVjZWQgZmlyaW5nLCBpZGVudGlmaWVkKQ0KQ0VMTF9JTkZPIDwtIGluZm9fYmFzZWxpbmUgJT4lDQogIHNlbGVjdChmaWxlX25hbWUpICU+JQ0KICBhZGRfY29sdW1uKGNlbGxfaWQgPSBzdWJzdHIoaW5mb19iYXNlbGluZSRmaWxlX25hbWUsIDEsIDYpLCAuYmVmb3JlID0gImZpbGVfbmFtZSIpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGJsX2FjdGl2aXR5ID0gVCkgJT4lDQogIGRwbHlyOjptdXRhdGUoYmxfYWN0aXZpdHkgPSByZXBsYWNlKA0KICAgIGJsX2FjdGl2aXR5LA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIxIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIsDQogICAgRg0KICApKSAlPiUNCiAgZHBseXI6Om11dGF0ZShwaW5jaCA9IFQpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBpbmNoID0gcmVwbGFjZSgNCiAgICBwaW5jaCwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE5IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiLA0KICAgIEYNCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoaWRlbnQgPSBUKSAlPiUNCiAgZHBseXI6Om11dGF0ZShpZGVudCA9IHJlcGxhY2UoDQogICAgaWRlbnQsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDA3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTIiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDEzIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI1IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNiIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjciLA0KICAgIEYNCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoY29udHJvbCA9IEYpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNvbnRyb2wgPSByZXBsYWNlKA0KICAgIGNvbnRyb2wsDQogICAgLiRjZWxsX2lkID09ICJjZWxsMjUiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI2IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyNyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjgiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDI5IiwNCiAgICBUDQogICkpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBvc2l0aW9uID0gInVua25vd24iKSAlPiUNCiAgZHBseXI6Om11dGF0ZShwb3NpdGlvbiA9IHJlcGxhY2UoDQogICAgcG9zaXRpb24sDQogICAgLiRjZWxsX2lkID09ICJjZWxsMDEiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDAyIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwwMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTAiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDExIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwxNCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTUiLA0KICAgICJJTCINCiAgKSkgJT4lDQogIGRwbHlyOjptdXRhdGUocG9zaXRpb24gPSByZXBsYWNlKA0KICAgIHBvc2l0aW9uLA0KICAgIC4kY2VsbF9pZCA9PSAiY2VsbDIwIiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMSIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjIiLA0KICAgICJ0cmFuc2llbnQiDQogICkpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHBvc2l0aW9uID0gcmVwbGFjZSgNCiAgICBwb3NpdGlvbiwNCiAgICAuJGNlbGxfaWQgPT0gImNlbGwwOCIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMTYiIHwNCiAgICAgIC4kY2VsbF9pZCA9PSAiY2VsbDE3IiB8DQogICAgICAuJGNlbGxfaWQgPT0gImNlbGwyMyIgfA0KICAgICAgLiRjZWxsX2lkID09ICJjZWxsMjQiLA0KICAgICJQRiINCiAgKSkNCg0KZGF0YXRhYmxlKENFTExfSU5GTywNCiAgY2FwdGlvbiA9ICJDRUxMX0lORk8gdGFibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQoNCiMgSUxfc3RpbV9maXJpbmckZmlsZV9uYW1lICU+JSB1bmlxdWUoKSAlPiUgbGVuZ3RoKCkNCiMgaW5mb19zdGltJGZpbGVfbmFtZSAlPiUgbGVuZ3RoKCkNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIENhbGN1bGF0aW9ucw0KIyMjIEZpcmluZyByYXRlcw0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCiMjIyBDQUxDVUxBVElORyAtLS0tLS0tLQ0KDQpJTF9zdGltX2ZpcmluZyA8LSBsZWZ0X2pvaW4oSUxfc3RpbV9maXJpbmcsDQogIGluZm9fc3RpbSAlPiUNCiAgICBzZWxlY3QoDQogICAgICBmaWxlX25hbWUsDQogICAgICByZWNfbGVuZ3RoLA0KICAgICAgdHJhaW5fc3RhcnRzLA0KICAgICAgdHJhaW5fZW5kcywNCiAgICAgIHRyYWluX2xlbmd0aA0KICAgICksDQogIGJ5ID0gImZpbGVfbmFtZSINCikNCg0KIyMjIGNhbGN1bGF0aW5nIHN0aW0gc3RhcnQgdGltZXMNCnN0YXJ0X3RpbWVzIDwtIElMX3N0aW1fZmlyaW5nICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoZmlsZV9uYW1lKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSwgdHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIGRwbHlyOjptdXRhdGUoY2VsbF9pZCA9IHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGRwbHlyOjpncm91cF9ieShjZWxsX2lkKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZSh0cmFpbl9zdGFydHMgPSB1bmlxdWUodHJhaW5fc3RhcnRzKSkgJT4lDQogIHB1bGwodHJhaW5fc3RhcnRzKSAlPiUNCiAgc3Ryc3BsaXQoIiwiKSAlPiUNCiAgc2V0X25hbWVzKHN1YnN0cihpbmZvX3N0aW0kZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGxhcHBseShhcy5udW1lcmljKQ0KDQojIyMgY2FsY3VsYXRpbmcgc3RpbSBlbmQgdGltZXMNCmVuZF90aW1lcyA8LSBJTF9zdGltX2ZpcmluZyAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGZpbGVfbmFtZSkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UodHJhaW5fc3RhcnRzID0gdW5pcXVlKHRyYWluX3N0YXJ0cyksIHRyYWluX2VuZHMgPSB1bmlxdWUodHJhaW5fZW5kcykpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNlbGxfaWQgPSBzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoY2VsbF9pZCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpc2UodHJhaW5fZW5kcyA9IHVuaXF1ZSh0cmFpbl9lbmRzKSkgJT4lDQogIHB1bGwodHJhaW5fZW5kcykgJT4lDQogIHN0cnNwbGl0KCIsIikgJT4lDQogIHNldF9uYW1lcyhzdWJzdHIoaW5mb19zdGltJGZpbGVfbmFtZSwgMSwgNikpICU+JQ0KICBsYXBwbHkoYXMubnVtZXJpYykNCg0KDQpjZWxsX2xpc3QgPC0gc3Vic3RyKGluZm9fc3RpbSRmaWxlX25hbWUsIDEsIDYpDQpDRUxMX0lORk8kY2VsbF9pZA0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KIyMjIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIEFQIGIvZC9hIHN0aW0uIEFyZ3VtZW50czogZGF0YSAoSUxfc3RpbV9maXJpbmcgdGFibGUgd2l0aCByZWNfbGVuZ3RoIGFuZCBzdGltdWx1cyB0cmFpbiBpbmZvcm1hdGlvbikNCkJEQUNhbGN1bGF0b3IgPC0gZnVuY3Rpb24oZGF0YSwgbGlzdCkgew0KICBjZWxsX2xpc3QgPC0gbGlzdA0KDQogIHRyYWluX2xlbmd0aCA8LSBkYXRhICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc3Vic3RyKGZpbGVfbmFtZSwgMSwgNikgPT0gY2VsbF9saXN0KSAlPiUNCiAgICBzZWxlY3QodHJhaW5fbGVuZ3RoKSAlPiUNCiAgICBwdWxsKCkgJT4lDQogICAgYFtbYCgxKQ0KDQoNCg0KICBpZiAoDQogICAgKGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgICBzZWxlY3QodW5pdF9pZCkgJT4lDQogICAgICB1bmlxdWUoKSAlPiUNCiAgICAgIHB1bGwoKSAlPiUNCiAgICAgIGxlbmd0aCgpKSA9PSAxDQogICkgew0KICAgICMjIyBJbiBjYXNlIG9mIG9uZSB1bml0IGluIHRoZSBmaWxlOg0KICAgIEFQX3RpbWVzIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgICBzZWxlY3Qoc2lnbmFsX3RpbWUpICU+JQ0KICAgICAgcHVsbCgpDQoNCiAgICBBUF9udW1iZXJzIDwtIG1hdHJpeCgwLCBucm93ID0gbGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSksIG5jb2wgPSAzKQ0KICAgIGNvbG5hbWVzKEFQX251bWJlcnMpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAxXSA8LSBsZW5ndGgoQVBfdGltZXNbc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gLSB0cmFpbl9sZW5ndGgNCiAgICAgIDwgQVBfdGltZXMgJiBBUF90aW1lcyA8IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGR1cmluZw0KICAgICAgQVBfbnVtYmVyc1t0cmFpbl9udW0sIDJdIDwtIGxlbmd0aChBUF90aW1lc1tBUF90aW1lcyA+IHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYgQVBfdGltZXMgPCBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgYWZ0ZXINCiAgICAgIEFQX251bWJlcnNbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNbQVBfdGltZXMgPiBlbmRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lcyA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQogICAgbWVsdChBUF9udW1iZXJzLCB2YXJuYW1lcyA9IGMoInRyYWluIiwgInN0aW1fY29uZCIpLCB2YWx1ZS5uYW1lID0gIk5vX0FQIikgJT4lDQogICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgIGFkZF9jb2x1bW4oY2VsbF9pZCA9IGNlbGxfbGlzdCkgJT4lDQogICAgICBhZGRfY29sdW1uKHRyYWluX2xlbmd0aCA9IHRyYWluX2xlbmd0aCkNCiAgfSBlbHNlIHsNCiAgICAjIyMgaW4gY2FzZSBvZiBtdWx0aXBsZSB1bml0cyBpbiB0aGUgZmlsZToNCiAgICBBUF90aW1lc18xIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAxKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCg0KICAgIEFQX251bWJlcnNfMSA8LSBtYXRyaXgoMCwgbnJvdyA9IGxlbmd0aChzdGFydF90aW1lc1tbY2VsbF9saXN0XV0pLCBuY29sID0gMykNCiAgICBjb2xuYW1lcyhBUF9udW1iZXJzXzEpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNfMVt0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc18xW3N0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dIC0gdHJhaW5fbGVuZ3RoDQogICAgICA8IEFQX3RpbWVzXzEgJiBBUF90aW1lc18xIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzFbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMVtBUF90aW1lc18xID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lc18xIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGFmdGVyDQogICAgICBBUF9udW1iZXJzXzFbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNfMVtBUF90aW1lc18xID4gZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYNCiAgICAgICAgQVBfdGltZXNfMSA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQoNCiAgICBBUF90aW1lc18yIDwtIGRhdGEgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKHN1YnN0cihmaWxlX25hbWUsIDEsIDYpID09IGNlbGxfbGlzdCwgc2lnbmFsX3R5cGUgPT0gIkFQIiwgdW5pdF9pZCA9PSAyKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkNCg0KICAgIEFQX251bWJlcnNfMiA8LSBtYXRyaXgoMCwgbnJvdyA9IGxlbmd0aChzdGFydF90aW1lc1tbY2VsbF9saXN0XV0pLCBuY29sID0gMykNCiAgICBjb2xuYW1lcyhBUF9udW1iZXJzXzIpIDwtIGMoImIiLCAiZCIsICJhIikNCg0KICAgIGZvciAodHJhaW5fbnVtIGluIDE6bGVuZ3RoKHN0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXSkpIHsNCiAgICAgICMjIyBiZWZvcmUNCiAgICAgIEFQX251bWJlcnNfMlt0cmFpbl9udW0sIDFdIDwtIGxlbmd0aChBUF90aW1lc18yW3N0YXJ0X3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dIC0gdHJhaW5fbGVuZ3RoDQogICAgICA8IEFQX3RpbWVzXzIgJiBBUF90aW1lc18yIDwgc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV1dKQ0KDQogICAgICAjIyMgZHVyaW5nDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAyXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gc3RhcnRfdGltZXNbW2NlbGxfbGlzdF1dW3RyYWluX251bV0gJg0KICAgICAgICBBUF90aW1lc18yIDwgZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dXSkNCg0KICAgICAgIyMjIGFmdGVyDQogICAgICBBUF9udW1iZXJzXzJbdHJhaW5fbnVtLCAzXSA8LSBsZW5ndGgoQVBfdGltZXNfMltBUF90aW1lc18yID4gZW5kX3RpbWVzW1tjZWxsX2xpc3RdXVt0cmFpbl9udW1dICYNCiAgICAgICAgQVBfdGltZXNfMiA8IGVuZF90aW1lc1tbY2VsbF9saXN0XV1bdHJhaW5fbnVtXSArIHRyYWluX2xlbmd0aF0pDQogICAgfQ0KDQoNCg0KICAgIGlmIChjZWxsX2xpc3QgJT4lIHN1YnN0cig1LCA2KSAlPiUgYXMubnVtZXJpYygpICU+JSBuY2hhcigpID09IDEpIHsNCiAgICAgIG5ld19uYW1lIDwtIHBhc3RlMCgNCiAgICAgICAgImNlbGwwIiwNCiAgICAgICAgY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSArIDENCiAgICAgICkNCiAgICB9DQoNCiAgICBpZiAoY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSAlPiUgbmNoYXIoKSA9PSAyKSB7DQogICAgICBuZXdfbmFtZSA8LSBwYXN0ZTAoDQogICAgICAgICJjZWxsIiwNCiAgICAgICAgY2VsbF9saXN0ICU+JSBzdWJzdHIoNSwgNikgJT4lIGFzLm51bWVyaWMoKSArIDENCiAgICAgICkNCiAgICB9DQoNCiAgICBiaW5kX3Jvd3MoDQogICAgICBtZWx0KEFQX251bWJlcnNfMSwgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbihjZWxsX2lkID0gY2VsbF9saXN0KSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbih0cmFpbl9sZW5ndGggPSB0cmFpbl9sZW5ndGgpLA0KDQogICAgICBtZWx0KEFQX251bWJlcnNfMiwgdmFybmFtZXMgPSBjKCJ0cmFpbiIsICJzdGltX2NvbmQiKSwgdmFsdWUubmFtZSA9ICJOb19BUCIpICU+JQ0KICAgICAgICBhcy50aWJibGUoKSAlPiUNCiAgICAgICAgYWRkX2NvbHVtbihjZWxsX2lkID0gbmV3X25hbWUpICU+JQ0KICAgICAgICBhZGRfY29sdW1uKHRyYWluX2xlbmd0aCA9IHRyYWluX2xlbmd0aCkNCiAgICApDQogIH0gIyBlbHNlDQp9ICMgZm9vDQpgYGANCg0KKipiX2RfYV9NRlIqKjogQ2FsY3VsYXRpbmcgdGhlIG51bWJlciBvZiBBUHMgLXVzaW5nIGEgY3VzdG9tIG1hZGUgZnVuY3Rpb24gKCpCREFDYWxjdWxhdG9yKiktIGJlZm9yZSBkdXJpbmcgYW5kIGFmdGVyIHRoZSBzdGltdWx1cyB0cmFpbnMgKCpiX2RfYV9NRlIqKS4gDQoNCmBgYHtyfQ0KYl9kX2FfTUZSIDwtIGxhcHBseShDRUxMX0lORk8kY2VsbF9pZCwgQkRBQ2FsY3VsYXRvciwgZGF0YSA9IElMX3N0aW1fZmlyaW5nKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGRwbHlyOjptdXRhdGUoRlIgPSBOb19BUCAvIHRyYWluX2xlbmd0aCkgJT4lDQogIGRwbHlyOjpncm91cF9ieShzdGltX2NvbmQsIGNlbGxfaWQpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXNlKE1GUiA9IG1lYW4oRlIpKQ0KYGBgDQoNCjxicj4NCioqc2RfbWVhbl9pc2kqKjogQ2FsY3VsYXRpbmcgdGhlIGJhc2VsaW5lIE1GUiBvZiB0aGUgcmVjb3JkZWQgSUwgY2VsbHMgZnJvbSB0aGUgKklMX2Jhc2VsaW5lX2ZpcmluZyogdGFibGUgdXNpbmcgYSBjdXN0b20gbWFkZSBmdW5jdGlvbiAoKlNETWVhbklTSSopLiBUaGUgcmVzdWx0cyBhcmUgc3RvcmVkIGluIHRoZSAqc2RfbWVhbl9pc2kqIHRhYmxlLg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCklMX2Jhc2VsaW5lX2ZpcmluZyA8LSBsZWZ0X2pvaW4oSUxfYmFzZWxpbmVfZmlyaW5nLA0KICBpbmZvX2Jhc2VsaW5lICU+JQ0KICAgIHNlbGVjdChmaWxlX25hbWUsIHJlY19sZW5ndGgpLA0KICBieSA9ICJmaWxlX25hbWUiDQopICU+JQ0KICBkcGx5cjo6bXV0YXRlKHN0aW1fY29uZCA9ICJiYXNlbGluZSIpDQoNCiMjIyBmdW5jdGlvbiB0byBjYWxjdWxhdGUgSVNJIG1lYW4gYW5kIFNEIGR1cmluZyBiYXNlbGluZSBhY3Rpdml0eSBvZiB0aGUgY2VsbHMNClNETWVhbklTSSA8LSBmdW5jdGlvbihmX25hbWUpIHsNCg0KDQogICMgbWVhbl9pc2kgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAjICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgIyAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICMgICBwdWxsKCkgJT4lDQogICMgICBkaWZmKCkgJT4lDQogICMgICBtZWFuKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHNkX2lzaSA8LSBJTF9iYXNlbGluZV9maXJpbmcgJT4lDQogICMgICBkcGx5cjo6ZmlsdGVyKGZpbGVfbmFtZSA9PSBmX25hbWUsIHNpZ25hbF90eXBlID09ICJBUCIpICU+JQ0KICAjICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgIyAgIHB1bGwoKSAlPiUNCiAgIyAgIGRpZmYoKSAlPiUNCiAgIyAgIHNkKCkgKiAxMDAwICU+JQ0KICAjICAgYG5hbWVzPC1gKGZfbmFtZSkNCiAgIw0KICAjIHJldHVybihsaXN0KE1GUiA9IG1lYW5faXNpLA0KICAjICAgICAgICAgICAgIFNERlIgPSBzZF9pc2kpKQ0KDQogIHRtcDIgPC0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoZmlsZV9uYW1lID09IGZfbmFtZSwgc2lnbmFsX3R5cGUgPT0gIkFQIikgJT4lDQogICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICBwdWxsKCkgJT4lDQogICAgZGlmZigpICU+JQ0KICAgIG1lYW4oKSAqIDEwMDAgJT4lDQogICAgICB0aWJibGUobWVhbl9pc2kgPSAuKQ0KICB0bXAyICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoc2RfaXNpID0gSUxfYmFzZWxpbmVfZmlyaW5nICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmaWxlX25hbWUgPT0gZl9uYW1lLCBzaWduYWxfdHlwZSA9PSAiQVAiKSAlPiUNCiAgICAgIHNlbGVjdChzaWduYWxfdGltZSkgJT4lDQogICAgICBwdWxsKCkgJT4lDQogICAgICBkaWZmKCkgJT4lDQogICAgICBzZCgpICogMTAwMCkgJT4lDQogICAgZHBseXI6Om11dGF0ZShmaWxlX25hbWUgPSBmX25hbWUpDQp9DQoNCnNkX21lYW5faXNpIDwtIGxhcHBseShpbmZvX2Jhc2VsaW5lJGZpbGVfbmFtZSwgU0RNZWFuSVNJKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGFzLnRpYmJsZSgpDQoNCnNkX21lYW5faXNpIDwtIHNkX21lYW5faXNpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNlbGxfaWQgPSBzdWJzdHIoc2RfbWVhbl9pc2kkZmlsZV9uYW1lLCAxLCA2KSkgJT4lDQogIGRwbHlyOjptdXRhdGUoTUZSID0gMTAwMCAvIG1lYW5faXNpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShTRF9GUiA9IDEwMDAgLyBzZF9pc2kpICU+JQ0KICBkcGx5cjo6bXV0YXRlKE1GUl9pbmMgPSBNRlIgKyBTRF9GUikgJT4lDQogIGRwbHlyOjptdXRhdGUoTUZSX2RlYyA9IE1GUiAtIFNEX0ZSKSAlPiUNCiAgIyBkcGx5cjo6bXV0YXRlKE1GUl9pbmMgPSAxMDAwLyhtZWFuX2lzaS1zZF9pc2kpKSAlPiUNCiAgIyBkcGx5cjo6bXV0YXRlKE1GUl9kZWMgPSAxMDAwLyhtZWFuX2lzaStzZF9pc2kpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShzdGltX2NvbmQgPSAiYmFzZWxpbmUiKSAlPiUNCiAgZHBseXI6Om11dGF0ZShNRlJfZGVjID0gcmVwbGFjZShNRlJfZGVjLCBzZF9tZWFuX2lzaSRNRlJfZGVjIDwgMCwgMCkpDQpgYGANCjxicj4NCg0KIyMjIFJhbmtzIChzdHJlbmd0aCBvZiBpbmhpYml0aW9uKQ0KKipjZWxscmFua3MqKjogQ2FsY3VsYXRpbmcgcmFua3MgYmFzZWQgb24gdGhlIGFjdGl2aXR5IGNoYW5nZSBmcm9tICIqYmFzZWxpbmUqIiB0byAiKmR1cmluZyBzdGltdWx1cyoiLiBJZiB0aGUgYWN0aXZpdHkgY2hhbmdlIGlzIG5lZ2F0aXZlIChkZWNyZWFzZWQgTUZSKSB0aGUgYXNpZ25lZCByYW5rIGlzIG5lZ2F0aXZlLCBpZiBpdCBpcyBwb3NpdGl2ZSAoaW5jcmVhc2VkIE1GUikgdGhlIGFzc2lnbmVkIHJhbmsgaXMgcG9zaXRpdmUuDQoNCjxicj4NCg0KQ2FsY3VsYXRpbmcgdGhlIGZpcmluZyByYXRlIGNoYW5nZSBkdXJpbmcgc3RpbXVsdXMgKHBob3RvYWN0aXZhdGlvbiBvZiB0aGUgZ2x5Y2luZXJnaWMgZmliZXJzKSBjb21wYXJlZCB0byBiYXNlbGluZToNCg0KPGJyPjxicj48YnI+DQoNCiQkXG1hdGhiZnthY3Rpdml0eVxfY2hhbmdlfSA9IFxmcmFje2R1cmluZ1xfTUZSIC0gYmFzZVxfTUZSfXtiYXNlXF9NRlJ9ICogMTAwJCQNCjxicj4NCg0KYGBge3J9DQpjZWxscmFua3MgPC0gYl9kX2FfTUZSICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkoc3RpbV9jb25kKSAlPiUNCiAgZHBseXI6Om11dGF0ZShiYXNlX01GUiA9IHNkX21lYW5faXNpJE1GUikgJT4lDQogIGRwbHlyOjptdXRhdGUoYWN0aXZpdHlfY2hhbmdlID0gKChNRlIgLSBiYXNlX01GUikgLyBiYXNlX01GUiAqIDEwMCkgJT4lIHJvdW5kKDIpKSAlPiUNCiAgZHBseXI6OmZpbHRlcihzdGltX2NvbmQgPT0gImQiKSAlPiUNCiAgZHBseXI6Om11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2UgPiAwLA0KICAgIHJhbmsoYWN0aXZpdHlfY2hhbmdlKSwNCiAgICAtcmFuaygtYWN0aXZpdHlfY2hhbmdlKQ0KICApKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBsZWZ0X2pvaW4oQ0VMTF9JTkZPICU+JQ0KICAgIHNlbGVjdChjZWxsX2lkLCBjb250cm9sLCBwaW5jaCwgcG9zaXRpb24pLA0KICBieSA9ICJjZWxsX2lkIg0KICApDQpjZWxscmFua3MNCmBgYA0KDQoNCg0KKipjZWxscmFua3NfYmVmb3JlX3N0aW0qKjogQ2FsY3VsYXRpbmcgcmFua3MgYmFzZWQgb24gdGhlIGFjdGl2aXR5IGNoYW5nZSBmcm9tICIqYmVmb3JlIHN0aW11bHVzKiIgdG8gIipkdXJpbmcgc3RpbXVsdXMqIi4gSWYgdGhlIGFjdGl2aXR5IGNoYW5nZSBpcyBuZWdhdGl2ZSAoZGVjcmVhc2VkIE1GUikgdGhlIGFzaWduZWQgcmFuayBpcyBuZWdhdGl2ZSwgaWYgaXQgaXMgcG9zaXRpdmUgKGluY3JlYXNlZCBNRlIpIHRoZSBhc3NpZ25lZCByYW5rIGlzIHBvc2l0aXZlLg0KDQo8YnI+DQoNCkNhbGN1bGF0aW5nIHRoZSBmaXJpbmcgcmF0ZSBjaGFuZ2UgZHVyaW5nIHN0aW11bHVzIChwaG90b2FjdGl2YXRpb24gb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVycykgY29tcGFyZWQgdG8gYmVmb3JlIHN0aW11bHVzOg0KDQo8YnI+PGJyPjxicj4NCg0KJCRcbWF0aGJme2FjdGl2aXR5XF9jaGFuZ2V9ID0gXGZyYWN7ZHVyaW5nXF9NRlIgLSBiZWZvcmVcX01GUn17YmVmb3JlXF9NRlJ9ICogMTAwJCQNCjxicj4NCg0KDQoNCmBgYHtyfQ0KY2VsbHJhbmtzX2JlZm9yZV9zdGltIDwtIGJfZF9hX01GUiAlPiUNCiAgc3ByZWFkKGtleSA9IHN0aW1fY29uZCwgdmFsdWUgPSBNRlIpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGFjdGl2aXR5X2NoYW5nZSA9ICgoZCAtIGIpIC8gYiAqIDEwMCkgJT4lIHJvdW5kKDIpKSAlPiUNCiAgZHBseXI6Om11dGF0ZShjaGFuZ2VfcmFuayA9IGlmZWxzZShhY3Rpdml0eV9jaGFuZ2UgPiAwLA0KICAgIHJhbmsoYWN0aXZpdHlfY2hhbmdlKSwNCiAgICAtcmFuaygtYWN0aXZpdHlfY2hhbmdlKQ0KICApKSAlPiUNCiAgbGVmdF9qb2luKENFTExfSU5GTyAlPiUNCiAgICBzZWxlY3QoY2VsbF9pZCwgY29udHJvbCwgcGluY2gsIHBvc2l0aW9uKSwNCiAgYnkgPSAiY2VsbF9pZCINCiAgKQ0KY2VsbHJhbmtzX2JlZm9yZV9zdGltDQpgYGANCg0KDQoNCjxicj48YnI+DQoNCiMjIyBEYXRhIHRvIHBsb3QNCioqVE9fUExPVCoqOiBDb21iaW5pbmcgKmJfZF9hX01GUiogKGZpcmluZyByYXRlIG9mIDI5IElMIG5ldXJvbnMgYi9kL2Egc3RpbSkgd2l0aCAqc2RfbWVhbl9pc2kqIHRhYmxlIChiYXNlbGluZSBmaXJpbmcgcmF0ZSBvZiB0aGUgc2FtZSAyOSBuZXVyb25zKSwgam9pbmluZyB3aXRoIENFTExfSU5GTyBjb250YWluaW5nIGltcG9ydGFudCBpbmZvcm1hdGlvbiBvZiB0aGUgY2VsbHMgKGJhc2VsaW5lIGFjdGl2aXR5LCBpZGVudGlmaWVkLCBwaW5jaGVkLCBjb250cm9sKSBhbmQgd2l0aCAqY2VsbHJhbmtzKiBjb250YWluaW5nIHRoZSByYW5rcyBhc2lnbmVkIHRvIGVhY2ggY2VsbHMgYmFzZWQgb24gdGhlIGNoYW5nZXMgaW4gTUZSIGR1cmluZyB0aGUgc3RpbXVsdXMgY29tcGFyZWQgdG8gYmFzZWxpbmUuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KVE9fUExPVCA8LSBiaW5kX3Jvd3MoDQogIHNkX21lYW5faXNpICU+JQ0KICAgIHNlbGVjdChNRlIsIGNlbGxfaWQsIHN0aW1fY29uZCksDQogIGJfZF9hX01GUg0KKSAlPiUNCiAgbGVmdF9qb2luKENFTExfSU5GTyAlPiUNCiAgICBzZWxlY3QoLWZpbGVfbmFtZSksDQogIGJ5ID0gImNlbGxfaWQiDQogICkgJT4lDQogIGxlZnRfam9pbihjZWxscmFua3MgJT4lDQogICAgc2VsZWN0KGNlbGxfaWQsIGNoYW5nZV9yYW5rLCBhY3Rpdml0eV9jaGFuZ2UpLA0KICBieSA9ICJjZWxsX2lkIg0KICApDQoNCmRhdGF0YWJsZShUT19QTE9ULA0KICBjYXB0aW9uID0gIlRPX1BMT1QgdGFibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCjxicj48YnI+DQoNCiMjIFBsb3R0aW5nDQoNCiMjIyBCYXNlbGluZSB2cy4gImJlZm9yZSIgc3RpbXVsdXMgYWN0aXZpdHkNCg0KQ29tcGFyaXNvbiBvZiBiYXNlbGluZSBhbmQgImJlZm9yZSIgc3RpbXVsdXMgZmlyaW5nIHJhdGVzIGluIHRoZSBjYXNlIG9mIHNwb250YW5lb3VzbHkgYWN0aXZlIGFuZCBzcG9udGVuZW91c2x5IGluYWN0aXZlIChwaW5jaCkgbmV1cm9ucy4gU3BvbnRhbmVvdXNseSBpbmFjdGl2ZSBuZXVyb25zIHNob3dlZCBzaWduaWZpY2FudGx5IGhpZ2hlciBNRlIgYmVmb3JlIHN0aXVsdXMgY29tcGFyZWQgdG8gYmFzZWxpbmUuDQoNCmBgYHtyLCBmaWcud2lkdGg9MTAsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYmFzZWxpbmUiIHwgc3RpbV9jb25kID09ICJiIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImJhc2VsaW5lIiwgImIiKSwNCiAgICB5ID0gTUZSDQogICkNCikgKw0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjIsIGFscGhhID0gMC41KSArDQogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBwaW5jaCksDQogICAgc2hhcGUgPSAyMSwNCiAgICAjIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCwgY29sID0gcGluY2gpDQogICkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAwKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIHhsYWIoIlJlY29yZGluZyBwZXJpb2QiKSArDQogIGZhY2V0X3dyYXAodmFycyhwaW5jaCkpICsNCiAgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ3aWxjb3gudGVzdCIsIHBhaXJlZCA9IFQpICsNCiAgZ2VvbV9sYWJlbF9yZXBlbCgNCiAgICBkYXRhID0gVE9fUExPVCAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgICAgc3RpbV9jb25kID09ICJiYXNlbGluZSINCiAgICAgICksDQogICAgbWFwcGluZyA9IGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIG51ZGdlX3ggPSAtLjksDQogICAgZGlyZWN0aW9uID0gInkiLA0KICAgICMgaGp1c3QgPSAyLA0KICAgIHNlZ21lbnQuc2l6ZSA9IC4yDQogICkNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgTUZSIGJlZm9yZSwgZHVyaW5nIGFuZCBhZnRlciBzdGltdWx1cyANCg0KYGBge3IsIGZpZy53aWR0aD0xNCwgZmlnLmhlaWdodD0xMiAsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGNvbnRyb2wgPT0gRiwNCiAgICAgIHN0aW1fY29uZCA9PSAiYiIgfCBzdGltX2NvbmQgPT0gImQiIHwgc3RpbV9jb25kID09ICJhIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKHN0aW1fY29uZCwgImIiLCAiZCIsICJhIiksDQogICAgeSA9IE1GUg0KICApDQopICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gMCkpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICBnZ3RpdGxlKCJQaW5jaCIsICkgKw0KICB4bGFiKCJSZWNvcmRpbmcgcGVyaW9kIikgKw0KICB5bGltKDAsIDM1KSArDQogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludCgNCiAgICBzaGFwZSA9IDIxLA0KICAgIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCksDQogICAgY29sb3IgPSAiI0VCODEwNCINCiAgKSArDQogIGdlb21fbGFiZWxfcmVwZWwoDQogICAgZGF0YSA9IFRPX1BMT1QgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgICBjb250cm9sID09IEYsDQogICAgICAgIHN0aW1fY29uZCA9PSAiYSINCiAgICAgICksDQogICAgbWFwcGluZyA9IGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIG51ZGdlX3ggPSAwLjE1LA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBoanVzdCA9IC0wLjUsDQogICAgc2VnbWVudC5zaXplID0gLjINCiAgKSArDQogIGZhY2V0X3dyYXAodmFycyhwaW5jaCkpDQpgYGANCjxicj48YnI+DQoNCiMjIyBTdHJlbmd0aCBvZiBpbmhpYml0aW9uDQoNCkZpcmluZyByYXRlIGNoYW5nZSAqKmR1cmluZyoqIHN0aW11bHVzIChwaG90b2FjdGl2YXRpb24gb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVycykgY29tcGFyZWQgdG8gKipiYXNlbGluZSoqOg0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBjZWxscmFua3MsDQogIG1hcHBpbmcgPSBhZXMoeCA9IGNoYW5nZV9yYW5rLCB5ID0gYWN0aXZpdHlfY2hhbmdlKQ0KKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gRiksIHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGNlbGxyYW5rcyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGNvbnRyb2wgPT0gVCksIHNpemUgPSAzLCBjb2wgPSAibWFnZW50YSIpICsNCiAgIyMjIGxhYmVsIGZvciBuZWdhdGl2ZSB2YWx1ZXMNCiAgZ2VvbV90ZXh0X3JlcGVsKA0KICAgIGRhdGEgPSBjZWxscmFua3MgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGFjdGl2aXR5X2NoYW5nZSA8IDApLA0KICAgIGFlcyhsYWJlbCA9IGNlbGxfaWQpLA0KICAgIGRpcmVjdGlvbiA9ICJ5IiwNCiAgICBhbmdsZSA9IDkwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeSA9IC0yDQogICkgKw0KDQogICMjIyBsYWJlbCBmb3IgcG9zaXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBkYXRhID0gY2VsbHJhbmtzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPiAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieCIsDQogICAgYW5nbGUgPSAwLA0KICAgIGhqdXN0ID0gLjUsDQogICAgbnVkZ2VfeCA9IC0xDQogICkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDI3LCB5ID0gLTE3LCBsYWJlbCA9ICJCYXNlbGluZSBhY3Rpdml0eSIsIGNvbCA9ICJncmF5IikgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2wgPSAiZ3JleSIsIGx0eSA9ICJkYXNoZWQiKSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IC0yLCB5ID0gMjgwLCBsYWJlbCA9ICJOZWdhdGl2ZSByYW5rOiBGUiBkZWNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyLCB5ID0gMjgwLCBsYWJlbCA9ICJQb3NpdGl2ZSByYW5rOiBGUiBpbmNyZWFzZSIsIGNvbCA9ICJncmF5IiwgYW5nbGUgPSA5MCkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIHlsaW0oLW1heChjZWxscmFua3MkYWN0aXZpdHlfY2hhbmdlKSwgbWF4KGNlbGxyYW5rcyRhY3Rpdml0eV9jaGFuZ2UpKQ0KYGBgDQoNCjxicj48YnI+DQoNCkZpcmluZyByYXRlIGNoYW5nZSAqKmR1cmluZyoqIHN0aW11bHVzIChwaG90b2FjdGl2YXRpb24gb2YgdGhlIGdseWNpbmVyZ2ljIGZpYmVycykgY29tcGFyZWQgdG8gKipiZWZvcmUqKiBzdGltdWx1czoNCg0KYGBge3IsIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KDQpnZ3Bsb3QoDQogIGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0sDQogIG1hcHBpbmcgPSBhZXMoeCA9IGNoYW5nZV9yYW5rLCB5ID0gYWN0aXZpdHlfY2hhbmdlKQ0KKSArDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGNlbGxyYW5rc19iZWZvcmVfc3RpbSAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoY29udHJvbCA9PSBGKSwgc2l6ZSA9IDYsDQogICAgYWVzKA0KICAgICAgY29sID0gcG9zaXRpb24sDQogICAgICBzaGFwZSA9IHBpbmNoDQogICAgKQ0KICApICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIklMIiA9ICJncmVlbiIsICJ0cmFuc2llbnQiID0gImJsdWUiLCAiUEYiID0gInJlZCIsICJ1bmtub3duIiA9ICJibGFjayIsICJjb250cm9sIiA9ICJtYWdlbnRhIikpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoIlRSVUUiID0gIisiLCAiRkFMU0UiID0gIi0iKSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjZWxscmFua3NfYmVmb3JlX3N0aW0gJT4lDQogICAgZHBseXI6OmZpbHRlcihjb250cm9sID09IFQpLCBzaXplID0gMywgY29sID0gIm1hZ2VudGEiKSArDQogICMjIyBsYWJlbCBmb3IgbmVnYXRpdmUgdmFsdWVzDQogIGdlb21fdGV4dF9yZXBlbCgNCiAgICBkYXRhID0gY2VsbHJhbmtzX2JlZm9yZV9zdGltICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihhY3Rpdml0eV9jaGFuZ2UgPCAwKSwNCiAgICBhZXMobGFiZWwgPSBjZWxsX2lkKSwNCiAgICBkaXJlY3Rpb24gPSAieSIsDQogICAgYW5nbGUgPSA5MCwNCiAgICBoanVzdCA9IC41LA0KICAgIG51ZGdlX3kgPSAtMg0KICApICsNCg0KICAjIyMgbGFiZWwgZm9yIHBvc2l0aXZlIHZhbHVlcw0KICBnZW9tX3RleHRfcmVwZWwoDQogICAgZGF0YSA9IGNlbGxyYW5rc19iZWZvcmVfc3RpbSAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoYWN0aXZpdHlfY2hhbmdlID4gMCksDQogICAgYWVzKGxhYmVsID0gY2VsbF9pZCksDQogICAgZGlyZWN0aW9uID0gIngiLA0KICAgIGFuZ2xlID0gMCwNCiAgICBoanVzdCA9IC41LA0KICAgIG51ZGdlX3ggPSAtMQ0KICApICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXkiLCBsdHkgPSAiZGFzaGVkIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyNywgeSA9IC0xNywgbGFiZWwgPSAiQmFzZWxpbmUgYWN0aXZpdHkiLCBjb2wgPSAiZ3JheSIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sID0gImdyZXkiLCBsdHkgPSAiZGFzaGVkIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAtMiwgeSA9IDI4MCwgbGFiZWwgPSAiTmVnYXRpdmUgcmFuazogRlIgZGVjcmVhc2UiLCBjb2wgPSAiZ3JheSIsIGFuZ2xlID0gOTApICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMiwgeSA9IDI4MCwgbGFiZWwgPSAiUG9zaXRpdmUgcmFuazogRlIgaW5jcmVhc2UiLCBjb2wgPSAiZ3JheSIsIGFuZ2xlID0gOTApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApDQogICkgKw0KICB4bGFiKCJSYW5rcyIpICsNCiAgeWxhYigiQ2hhbmdlIGluIGZpcmluZyByYXRlIFslXSIpICsNCiAgeWxpbSgtbWF4KGNlbGxyYW5rc19iZWZvcmVfc3RpbSRhY3Rpdml0eV9jaGFuZ2UpLCBtYXgoY2VsbHJhbmtzX2JlZm9yZV9zdGltJGFjdGl2aXR5X2NoYW5nZSkpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCjxicj48YnI+DQoNClBsb3R0aW5nIHRoZSBjaGFuZ2UgaW4gTUZSIGZyb20gIipiYXNlbGluZSoiIHRvICIqZHVyaW5nIHN0aW11bHVzKiIuIENvbG9yaW5nIGJhc2VkIG9uIHRoZSBzdHJlbmd0aCBvZiB0aGUgaW5oaWJpdGlvbiAoKnJhbmsqKQ0KDQpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEyLCBlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBjb250cm9sID09IEYsDQogICAgICBzdGltX2NvbmQgPT0gImJhc2VsaW5lIiB8IHN0aW1fY29uZCA9PSAiZCINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBmb3JjYXRzOjpmY3RfcmVsZXZlbChzdGltX2NvbmQsICJiYXNlbGluZSIsICJkIiwgImEiKSwNCiAgICB5ID0gTUZSDQogICkNCikgKw0KICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjIsIGFscGhhID0gMC41KSArDQogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBjaGFuZ2VfcmFuayksDQogICAgc2hhcGUgPSAyMSwNCiAgICAjIGZpbGwgPSAiI0VCODEwNCIsDQogICAgIyBjb2xvciA9ICJ3aGl0ZSIsDQogICAgc2l6ZSA9IDQNCiAgKSArDQogICMgc3Ryb2tlID0gMikgKw0KICBnZW9tX2xpbmUoDQogICAgYWVzKGdyb3VwID0gY2VsbF9pZCwgY29sID0gY2hhbmdlX3JhbmspDQogICkgKw0KICBnZW9tX2xhYmVsX3JlcGVsKA0KICAgIGRhdGEgPSBUT19QTE9UICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcigNCiAgICAgICAgY29udHJvbCA9PSBGLA0KICAgICAgICBzdGltX2NvbmQgPT0gImJhc2VsaW5lIg0KICAgICAgKSwNCiAgICBtYXBwaW5nID0gYWVzKGxhYmVsID0gY2VsbF9pZCwgY29sID0gY2hhbmdlX3JhbmspLA0KICAgICMgbnVkZ2VfeCA9IC0uMSwNCiAgICBkaXJlY3Rpb24gPSAieSIsDQogICAgaGp1c3QgPSA0LA0KICAgIHNlZ21lbnQuc2l6ZSA9IC4yDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkNCiAgKSArDQogIHhsYWIoIlJlY29yZGluZyBwZXJpb2QiKSArDQogIGxhYnMoZmlsbCA9ICJSYW5rIiwgY29sID0gIlJhbmsiKQ0KYGBgDQoNCg0KPGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+DQoNCg0KIyBBY3Rpdml0eSBvZiBQUkYgZ2x5Y2luZXJnaWMgY2VsbHMgZHVyaW5nIFBGQyBwaG90b2FjdGl2YXRpb24NCg0KIyMgTG9hZGluZyBhbmQgdHJhbnNmb3JtaW5nIChoaWRkZW4gY29kZSkgZGF0YQ0KDQoNCmBgYHtyIGxvYWRpbmcgZGF0YSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNvdXJjZShmaWxlLnBhdGgoInN1cHBsZW1lbnRhcnlfZnVuY3Rpb25zIiwgIkNyZWF0ZVJlY1RpYmJsZS5SIikpDQpSRUNPUkRJTkdTIDwtIENyZWF0ZVJlY1RpYmJsZSgNCiAgQVBfdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiY29ydGljYWxfc3RpbSIsICJBUF90aW1lcy5jc3YiKSksDQogIHN0aW1fdGltZXMgPSByZWFkX2NzdihmaWxlLnBhdGgoImRhdGEiLCAiY29ydGljYWxfc3RpbSIsICJzdGltX3RpbWVzLmNzdiIpKQ0KKQ0KDQoNCiMjIyBDQVJFRlVMIFdJVEggVEhJUyEhIEl0J3MgZ2VuZXJhdGVkIGJ5IHRoZSAiQ3JlYXRlUFNUSFRpYmJsZSIgZnVuY3Rpb24gYnV0IHRoZSBmcmVxdWVuY2llcyBoYXZlIHRvIGJlIGNoYW5nZWQgbWFudWFsbHksIGFuZCBpdCBjYW4gY3JlYXRlIGR1cGxpY2F0ZXMhIEkgaGF2ZSB0byB3b3JrIG9uIHRoYXQhDQpTVElNX1JFU1VMVFMgPC0gcmVhZF9jc3YoZmlsZS5wYXRoKCJvdXRwdXRfZGF0YSIsICJjb3J0aWNhbF9zdGltX2FuYWx5c2lzLmNzdiIpKQ0KYGBgDQoNCg0KYGBge3IgdHJhbnNmb3JtaW5nIGRhdGEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgYWRkaW5nIHN0aW11bHVzIG51bWJlciB3aXRoaW4gdHJhaW4NClJFQ09SRElOR1MgPC0gUkVDT1JESU5HUyAlPiUNCiAgZHBseXI6Om11dGF0ZShzdGltX251bWJlciA9IDApDQoNCiMjIyBjYWxjdWxhdGluZyBzdGltdWx1cyBudW1iZXIgd2l0aGluIHRyYWluDQppbml0aWFsX3ZhbHVlIDwtIFJFQ09SRElOR1Mkc3RpbV9mcmVxWzFdICU+JQ0KICBgY29tbWVudDwtYCgiRmlyc3QgdmFsdWUgb2Ygc3RpbV9mcmVxIHZhcmlhYmxlLiBXaGVuIGl0IGNoYW5nZXMgc3RpbXVsdXMgY291bnRpbmcgcmVzdGFydHMiKQ0KDQpzdGltX2NvdW50ZXIgPC0gMSAlPiUNCiAgYGNvbW1lbnQ8LWAoIkNvdW50cyBzdGltdWxpIGluIGEgdHJhaW4iKQ0KaW5kZXggPC0gMSAlPiUNCiAgYGNvbW1lbnQ8LWAoIlRyYWNrcyB0aGUgcG9zaXRpb24gKGluZGV4KSBvZiBzdGltX2ZyZXEiKQ0KDQpSRUNPUkRJTkdTJHN0aW1fbnVtYmVyWzFdIDwtIHN0aW1fY291bnRlcg0KcmVwZWF0ew0KICBpZiAoUkVDT1JESU5HUyRzdGltX2ZyZXFbaW5kZXggKyAxXSA9PSBpbml0aWFsX3ZhbHVlKSB7DQogICAgUkVDT1JESU5HUyRzdGltX251bWJlcltpbmRleCArIDFdIDwtIHN0aW1fY291bnRlciArIDENCiAgICBzdGltX2NvdW50ZXIgPC0gc3RpbV9jb3VudGVyICsgMQ0KICAgIGluZGV4IDwtIGluZGV4ICsgMQ0KICB9IGVsc2Ugew0KICAgIGluaXRpYWxfdmFsdWUgPC0gUkVDT1JESU5HUyRzdGltX2ZyZXFbaW5kZXggKyAxXQ0KICAgIHN0aW1fY291bnRlciA8LSAxDQogICAgUkVDT1JESU5HUyRzdGltX251bWJlcltpbmRleCArIDFdIDwtIHN0aW1fY291bnRlcg0KICAgIGluZGV4IDwtIGluZGV4ICsgMQ0KICB9DQoNCiAgaWYgKGluZGV4ID09IGxlbmd0aChSRUNPUkRJTkdTJHN0aW1fbnVtYmVyKSkgew0KICAgIGJyZWFrDQogIH0NCn0NCg0KIyMjIHJlcGxhY2luZyBzdGltX251bWJlciB3aXRoIE5BIGF0ICJBUCINClJFQ09SRElOR1Mkc3RpbV9udW1iZXJbUkVDT1JESU5HUyRzaWduYWxfdHlwZSA9PSAiQVAiXSA8LSBOQQ0KDQojIyMgY2F0ZWdvcml6aW5nIHN0aW11bGkNClJFQ09SRElOR1MgPC0gUkVDT1JESU5HUyAlPiUNCiAgZHBseXI6Om11dGF0ZShzdGltX2ZyZXFfY2F0ZWcgPSBzdGltX2ZyZXEpICU+JQ0KICBkcGx5cjo6bXV0YXRlKHN0aW1fZnJlcV9jYXRlZyA9IHJlcGxhY2UoDQogICAgeCA9IHN0aW1fZnJlcV9jYXRlZywNCiAgICBsaXN0ID0gKHN0aW1fZnJlcV9jYXRlZyA9PSAxMiB8IHN0aW1fZnJlcV9jYXRlZyA9PSA4KSwNCiAgICB2YWx1ZXMgPSAxMA0KICApKSAlPiUNCiAgZHBseXI6Om11dGF0ZShzdGltX2ZyZXFfY2F0ZWcgPSByZXBsYWNlKA0KICAgIHggPSBzdGltX2ZyZXFfY2F0ZWcsDQogICAgbGlzdCA9IChzdGltX2ZyZXFfY2F0ZWcgPT0gMTgpLA0KICAgIHZhbHVlcyA9IDIwDQogICkpDQpgYGANCg0KYGBge3IgY2FsY3VsYXRpbmcgaGlzdCBzdGF0cywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNvdXJjZShmaWxlLnBhdGgoInN1cHBsZW1lbnRhcnlfZnVuY3Rpb25zIiwgIkhpc3RTdGF0cy5SIikpDQoNClNUSU1fUkVTVUxUUyAlPiUNCiAgZHBseXI6Omdyb3VwX2J5KGZyZXEpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXNlKG5fdGltZXMgPSBsZW5ndGgodW5pcXVlKGFuaW1hbF9pZCkpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBhcy5tYXRyaXgoKSAlPiUNCiAgdW5uYW1lKCkgLT4gcmVwX21hdHJpeA0KDQojIyMgc2V0IFBTVEggcmFuZ2UNClBTVEhfcmFuZ2UgPC0gYygtMC4wMSwgMC4wNCkNCg0KDQpoaXN0X3N0YXRzIDwtIFNUSU1fUkVTVUxUUyAlPiUNCiAgZHBseXI6OmZpbHRlcigNCiAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdDQogICkgJT4lDQogIGRwbHlyOjpncm91cF9ieShmcmVxKSAlPiUNCiAgZG8oZ3BfaGlzdCA9IGdncGxvdCgNCiAgICBkYXRhID0gLiwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBmaXJzdF9hcF9yZWx0aW1lcykNCiAgKSArDQogICAgeGxpbShQU1RIX3JhbmdlWzFdLCBQU1RIX3JhbmdlWzJdKSArDQogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKGZpbGwgPSBhbmltYWxfaWQpLCBiaW53aWR0aCA9IDAuMDAxKSArDQogICAgc2NhbGVfZmlsbF9icmV3ZXIoDQogICAgICBwYWxldHRlID0gIlNldDMiLA0KICAgICAgbmFtZSA9ICJBbmltYWwiDQogICAgICAjIGd1aWRlID0gRkFMU0UNCiAgICApICsNCiAgICBmYWNldF93cmFwKH5hbmltYWxfaWQsIG5jb2wgPSAzKSArDQogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKw0KICAgIHhsYWIoIlRpbWUgKHMpIikgKw0KICAgIHlsYWIoIkNvdW50IikgKw0KICAgIGdndGl0bGUocGFzdGUwKC4kZnJlcSwgIiBIeiIpKQ0KICApICU+JQ0KICBgW1tgKDIpICU+JQ0KICBsYXBwbHkoLiAlPiUgSGlzdFN0YXRzKCkgJT4lIGFzLnRpYmJsZSgpKSAlPiUNCiAgYmluZF9yb3dzKCkgJT4lDQogIGFkZF9jb2x1bW4oDQogICAgZnJlcSA9IGMoDQogICAgICByZXAocmVwX21hdHJpeFsxLCAxXSwgcmVwX21hdHJpeFsxLCAyXSksDQogICAgICByZXAocmVwX21hdHJpeFsyLCAxXSwgcmVwX21hdHJpeFsyLCAyXSksDQogICAgICByZXAocmVwX21hdHJpeFszLCAxXSwgcmVwX21hdHJpeFszLCAyXSkNCiAgICApLA0KICAgIC5hZnRlciA9ICJhbmltYWxfaWQiDQogICkNCmBgYA0KDQoNCmBgYHtyIGNhbGN1bGF0aW5nIHJlc3BvbnNlIHByb2IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpSRVNQX1BST0IgPC0gbGVmdF9qb2luKA0KICBTVElNX1JFU1VMVFMgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXQ0KICAgICkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCwgZnJlcSkgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZShOb19BUHMgPSBsZW5ndGgoZmlyc3RfYXBfcmVsdGltZXMpKSAlPiUNCiAgICBkcGx5cjo6cmVuYW1lKHN0aW1fZnJlcSA9IGZyZXEpICU+JQ0KICAgIGRwbHlyOjptdXRhdGUoc3RpbV9mcmVxID0gcmVwbGFjZShzdGltX2ZyZXEsIHN0aW1fZnJlcSA9PSAxOCwgMjApKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKHN0aW1fZnJlcSA9IHJlcGxhY2Uoc3RpbV9mcmVxLCBzdGltX2ZyZXEgPT0gOCwgMTApKSwNCg0KICBSRUNPUkRJTkdTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc2lnbmFsX3R5cGUgPT0gInN0aW0iLCBzdGltX2ZyZXFfY2F0ZWcgJWluJSBjKCIxIiwgIjEwIiwgIjIwIikpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQsIHN0aW1fZnJlcV9jYXRlZykgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZShOb19zdGltID0gbGVuZ3RoKHNpZ25hbF90aW1lKSkgJT4lDQogICAgZHBseXI6Om11dGF0ZShzdGltX2ZyZXEgPSBhcy5udW1lcmljKHN0aW1fZnJlcV9jYXRlZykpICU+JQ0KICAgIHNlbGVjdCgtc3RpbV9mcmVxX2NhdGVnKQ0KKSAlPiUNCiAgYWRkX2NvbHVtbihOb19BUHNfcmFuZ2UgPSBoaXN0X3N0YXRzICU+JQ0KICAgIGFycmFuZ2UoYW5pbWFsX2lkKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKGZyZXEgPSByZXBsYWNlKGZyZXEsIGZyZXEgPT0gMTgsIDIwKSkgJT4lDQogICAgZHBseXI6Om11dGF0ZShmcmVxID0gcmVwbGFjZShmcmVxLCBmcmVxID09IDgsIDEwKSkgJT4lDQogICAgZHBseXI6OnJlbmFtZShzdGltX2ZyZXEgPSBmcmVxKSAlPiUgcHVsbChyYW5nZV9jb3VudF9zdW0pKSAlPiUNCiAgZHBseXI6Om11dGF0ZShyZXNwX3Byb2IgPSAoTm9fQVBzIC8gTm9fc3RpbSkgKiAxMDApICU+JQ0KICBkcGx5cjo6bXV0YXRlKHJlc3BfcHJvYl9yYW5nZSA9IChOb19BUHNfcmFuZ2UgLyBOb19zdGltKSAqIDEwMCkgJT4lDQogIGFkZF9jb2x1bW4ocGVha19sYXRlbmN5ID0gaGlzdF9zdGF0cyAlPiUNCiAgICBhcnJhbmdlKGFuaW1hbF9pZCkgJT4lDQogICAgcHVsbChwZWFrKSkgJT4lDQogIGFkZF9jb2x1bW4obWVhbl9sYXRlbmN5ID0gaGlzdF9zdGF0cyAlPiUNCiAgICBhcnJhbmdlKGFuaW1hbF9pZCkgJT4lDQogICAgcHVsbChtZWFuKSkNCmBgYA0KDQpgYGB7ciBjYWxjdWxhdGluZyBBUCBjb3VudCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCkFQQ291bnQgPC0gZnVuY3Rpb24oYW5pbWFsKSB7DQogIHRtcF9hcCA8LSBSRUNPUkRJTkdTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc2lnbmFsX3R5cGUgPT0gIkFQIiwgYW5pbWFsX2lkID09IGFuaW1hbCkgJT4lDQogICAgc2VsZWN0KHNpZ25hbF90aW1lKSAlPiUNCiAgICBwdWxsKCkNCg0KICBzdGltX3RyYWlucyA8LSBSRUNPUkRJTkdTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoc2lnbmFsX3R5cGUgPT0gInN0aW0iKSAlPiUNCiAgICBkcGx5cjo6bXV0YXRlKA0KICAgICAgbGFnX3NmYyA9IGxhZyhzdGltX2ZyZXEpLA0KICAgICAgdG1wX3ZhciA9IGlmZWxzZShsYWdfc2ZjID09IHN0aW1fZnJlcSAmICFpcy5uYShsYWdfc2ZjKSwgMCwgMSksDQogICAgICBjdW1fdG1wX3ZhciA9IGN1bXN1bSh0bXBfdmFyKQ0KICAgICkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCwgc3RpbV9mcmVxLCBjdW1fdG1wX3ZhcikgJT4lDQogICAgZHBseXI6Om11dGF0ZSh0cmFpbl9udW1iZXIgPSBncm91cF9pbmRpY2VzKCkpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBzZWxlY3QoLWxhZ19zZmMsIC10bXBfdmFyLCAtY3VtX3RtcF92YXIpICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoYW5pbWFsX2lkID09IGFuaW1hbCkgJT4lDQogICAgZHBseXI6Omdyb3VwX2J5KHN0aW1fZnJlcV9jYXRlZywgdHJhaW5fbnVtYmVyLCBzdGltX251bWJlcikgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZSgNCiAgICAgIE5vX0FQcyA9IGxlbmd0aCh0bXBfYXBbdG1wX2FwID4gc2lnbmFsX3RpbWUgJiB0bXBfYXAgPCBzaWduYWxfdGltZSArIDAuMDVdKSwNCiAgICAgIEFQX3RpbWVzID0gcGFzdGUodG1wX2FwW3RtcF9hcCA+IHNpZ25hbF90aW1lICYgdG1wX2FwIDwgc2lnbmFsX3RpbWUgKyAwLjA1XSwgY29sbGFwc2UgPSAiLCIpLA0KICAgICAgcmFuZ2VfbG93ZXIgPSBzaWduYWxfdGltZSwNCiAgICAgIHJhbmdlX3VwcGVyID0gc2lnbmFsX3RpbWUgKyAwLjA1DQogICAgKSAlPiUNCiAgICBhZGRfY29sdW1uKGFuaW1hbF9pZCA9IGFuaW1hbCwgLmJlZm9yZSA9IDEpICU+JQ0KICAgIHVuZ3JvdXAoKQ0KICByZXR1cm4oc3RpbV90cmFpbnMpDQp9DQoNCkFQQyA8LSBsYXBwbHkoUkVDT1JESU5HUyRhbmltYWxfaWQgJT4lIHVuaXF1ZSgpLCBBUENvdW50KSAlPiUgYmluZF9yb3dzKCkNCmBgYA0KDQoNCiogTGlzdCBvZiB0aWJibGVzIHVzZWQgdG8gc3RvcmUgZGF0YToNCiAgKyBSRUNPUkRJTkdTIHRpYmJsZTogc3RvcmVzIEFQIGFuZCBzdGltIHRpbWUgc3RhbXBzLCBudW1iZXIgb2Ygc3RpbXVsaSBpbiBlYWNoIHRyYWluLCBzdGltdWx1cyBmcmVxdWVuY3kgY2F0ZWdvcmllcyAoZWcuIDggMTAgYW5kIDEyIEh6IGJlbG9uZyB0byAxMCBIeiBjYXRlZ29yeSkNCiAgKyBTVElNX1JFU1VMVFM6IHN0b3JlcyB0aGUgZGF0YSBmb3IgUFNUSHMgKENBUkVGVUwgV0lUSCBUSElTISEgSXQncyBnZW5lcmF0ZWQgYnkgdGhlICJDcmVhdGVQU1RIVGliYmxlIiBmdW5jdGlvbiBidXQgdGhlIGZyZXF1ZW5jaWVzIGhhdmUgdG8gYmUgY2hhbmdlZCBtYW51YWxseSwgYW5kIGl0IGNhbiBjcmVhdGUgZHVwbGljYXRlcyEgSSBoYXZlIHRvIHdvcmsgb24gdGhhdCEgSWYgc29tZXRoaW5nIGRvZXNuJ3QgbG9vayByaWdodCBvbiBQU1RIcyBvciByZXNwb25zZSBwcm9iYWJpbGl0eSBwbG90cywgY2hlY2sgdGhpcyBvbmUgZmlyc3QpDQogICsgaGlzdF9zdGF0czogc3RvcmVzIFBTVEggc3RhdGlzdGljcyBjYWxjdWxhdGVkIGZyb20gZ2dwbG90IA0KICArIFJFU1BfUFJPQjogcmVzcG9uc2UgcHJvYmFiaWxpdHkgYW5kIGxhdGVuY3kgZGF0YSBjYWxjdWxhdGVkIGZyb20gc3RpbSByZXN1bHRzIGFuZCByZWNvcmRpbmdzDQogICsgQVBDOiBudW1iZXIgb2YgQVBzIGFmdGVyIGVhY2ggc3RpbXVsdXMgaW4gYSA1MCBtcyB3aW5kb3cNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZGF0YXRhYmxlKFJFQ09SRElOR1MsDQogIGNhcHRpb24gPSAiUkVDT1JESU5HUyB0aWJibGUiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgdGlkeT1UUlVFfQ0KZGF0YXRhYmxlKFNUSU1fUkVTVUxUUywNCiAgY2FwdGlvbiA9ICJTVElNX1JFU1VMVFMgdGliYmxlIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHRpZHk9VFJVRX0NCmRhdGF0YWJsZShoaXN0X3N0YXRzLA0KICBjYXB0aW9uID0gIlBTVEggc3RhdGlzdGljcyAoaGlzdF9zdGF0cyB0aWJibGUpIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkYXRhdGFibGUoUkVTUF9QUk9CLA0KICBjYXB0aW9uID0gIlJlc3BvbnNlIHByb2JhYmlsaXRpZXMiLA0KICByb3duYW1lcyA9IFRSVUUsDQogIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSA1MCwgc2Nyb2xsWCA9IFQsIHNjcm9sbFkgPSAiNTAwcHgiLCBkb20gPSAidCIpDQopDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdGF0YWJsZShBUEMsDQogIGNhcHRpb24gPSAiTnVtYmVyIG9mIEFQcyBmb2xvd2luZyBlYWNoIHN0aW11bHVzIiwNCiAgcm93bmFtZXMgPSBUUlVFLA0KICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNTAsIHNjcm9sbFggPSBULCBzY3JvbGxZID0gIjUwMHB4IiwgZG9tID0gInQiKQ0KKQ0KYGBgDQoNCg0KIyMgUGxvdHRpbmcNCg0KIyMjIERpc3RyaWJ1dGlvbiBvZiBmcmlzdCBBUHMgYWZ0ZXIgY29ydGljYWwgYWN0aXZhdGlvbg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0Kc291cmNlKGZpbGUucGF0aCgic3VwcGxlbWVudGFyeV9mdW5jdGlvbnMiLCAiZ2VvbV9mbGF0X3Zpb2xpbi5SIikpDQojIFBTVEhfcmFuZ2UgPC0gYygwLCAwLjA1KQ0KZ2dwbG90KA0KICBkYXRhID0gU1RJTV9SRVNVTFRTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA8IFBTVEhfcmFuZ2VbMl0NCiAgICApLA0KICBtYXBwaW5nID0gYWVzKHkgPSBmaXJzdF9hcF9yZWx0aW1lcywgeCA9IGFuaW1hbF9pZCkNCikgKw0KICBjb29yZF9mbGlwKCkgKw0KICBnZ2hhbHZlczo6Z2VvbV9oYWxmX3Zpb2xpbihzaWRlID0gInIiLCB0cmltID0gVCwgc2NhbGUgPSAid2lkdGgiKSArDQogICMgZ2VvbV9kb3RwbG90KGJpbmF4aXMgPSAieSIsDQogICMgICAgICAgICAgICAgIGRvdHNpemUgPSA0LA0KICAjICAgICAgICAgICAgICBzdGFja2RpciA9ICJkb3duIiwNCiAgIyAgICAgICAgICAgICAgYmlud2lkdGggPSAwLjAwMDIsbWV0aG9kID0gImhpc3RvZG90IixiaW5wb3NpdGlvbnMgPSAiYWxsIiwNCiAgIyAgICAgICAgICAgICAgKSArDQogICMgc2VlOjpnZW9tX3Zpb2xpbmRvdChiaW53aWR0aCA9IDAuMDAwMSxzaXplX2RvdHMgPSA2LCkgKw0KICBnZW9tX2ppdHRlcihwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwKSwgc2hhcGUgPSAifCIpICsNCiAgIyBnZW9tX2JveHBsb3Qod2lkdGggPSAuMSwgb3V0bGllci5jb2xvdXIgPSBOQSwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsNCiAgZmFjZXRfd3JhcCh+ZnJlcSkNCmBgYA0KDQojIyMgUFNUSCBAIDEgSHogY29ydGljYWwgYWN0aXZhdGlvbg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgbWFpbiBwbG90DQoNCiMjIyBzZXQgUFNUSCByYW5nZTogc2VlIGVhcmxpZXIgKGNhbGN1bGF0aW5nIGhpc3Qgc3RhdHMgY2h1bmspDQoNCiMjIyBzZWxlY3QgZnJlcXVlbmN5IHRvIHBsb3QgKDEsIDgsIDE4KQ0KZnJlcV90b19wbG90IDwtIDEgJT4lIGFzLmNoYXJhY3RlcigpDQoNCmdwX2hpc3QgPC0gZ2dwbG90KA0KICBkYXRhID0gU1RJTV9SRVNVTFRTICU+JQ0KICAgIGRwbHlyOjpmaWx0ZXIoDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA+IFBTVEhfcmFuZ2VbMV0sDQogICAgICBmaXJzdF9hcF9yZWx0aW1lcyA8IFBTVEhfcmFuZ2VbMl0sDQogICAgICBmcmVxID09IGZyZXFfdG9fcGxvdA0KICAgICAgIyBhbmltYWxfaWQgPT0gIkdJSV8yMSINCiAgICApLA0KICBtYXBwaW5nID0gYWVzKHggPSBmaXJzdF9hcF9yZWx0aW1lcykNCikgKw0KICB4bGltKFBTVEhfcmFuZ2VbMV0sIFBTVEhfcmFuZ2VbMl0pICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKGZpbGwgPSBhbmltYWxfaWQpLCBiaW53aWR0aCA9IDAuMDAxKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKA0KICAgIHBhbGV0dGUgPSAiU2V0MyIsDQogICAgbmFtZSA9ICJBbmltYWwiDQogICAgIyBndWlkZSA9IEZBTFNFDQogICkgKw0KICBmYWNldF93cmFwKH5hbmltYWxfaWQsIG5jb2wgPSAzKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsNCiAgeGxhYigiVGltZSAocykiKSArDQogIHlsYWIoIkNvdW50IikNCg0KDQoNCiMjIyBsaW5lcw0KZ3BfaGlzdCArDQogICMjIyBtZWRpYW4NCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IG1lZGlhbiwNCiAgICAgIHhlbmQgPSBtZWRpYW4sDQogICAgICB5ID0geV9tYXggKyA3LA0KICAgICAgeWVuZCA9IHlfbWF4ICsgMTgNCiAgICApLA0KICAgIHNpemUgPSAxDQogICkgKw0KDQogICMjIyBkYXRhIHJhbmdlDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcygNCiAgICAgIHggPSBxdWFudGlsZTI1IC0gMS41ICogSVFSLA0KICAgICAgeGVuZCA9IHF1YW50aWxlMjUsDQogICAgICB5ID0geV9tYXggKyAxMi41LA0KICAgICAgeWVuZCA9IHlfbWF4ICsgMTIuNQ0KICAgICkNCiAgKSArDQoNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBxdWFudGlsZTc1LCB4ZW5kID0gcXVhbnRpbGU3NSArIDEuNSAqIElRUiwgeSA9IHlfbWF4ICsgMTIuNSwgeWVuZCA9IHlfbWF4ICsgMTIuNSkNCiAgKSArDQoNCiAgIyMjIElRUiAoYm94KQ0KICBnZW9tX3JlY3QoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeG1pbiA9IHF1YW50aWxlMjUsIHhtYXggPSBxdWFudGlsZTc1LCB5bWluID0geV9tYXggKyA3LCB5bWF4ID0geV9tYXggKyAxOCksDQogICAgY29sb3IgPSAicmVkIiwNCiAgICBhbHBoYSA9IDAsDQogICAgaW5oZXJpdC5hZXMgPSBGDQogICkgKw0KDQogICMjIyBtZWFuDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IG1lYW4sIHkgPSB5X21heCArIDQpLCBzaXplID0gMg0KICApICsNCg0KICAjIyMgcGVhaw0KICBnZW9tX3BvaW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBwZWFrLCB5ID0geV9tYXggKyA0KSwNCiAgICBzaGFwZSA9IDI1LA0KICAgIHNpemUgPSAyLA0KICAgIGZpbGwgPSAicmVkIg0KICApDQpgYGANCg0KIyMjIFBTVEggQCAxMCBIeiBjb3J0aWNhbCBhY3RpdmF0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBtYWluIHBsb3QNCg0KIyMjIHNldCBQU1RIIHJhbmdlOiBzZWUgZWFybGllciAoY2FsY3VsYXRpbmcgaGlzdCBzdGF0cyBjaHVuaykNCg0KIyMjIHNlbGVjdCBmcmVxdWVuY3kgdG8gcGxvdCAoMSwgOCwgMTgpDQpmcmVxX3RvX3Bsb3QgPC0gOCAlPiUgYXMuY2hhcmFjdGVyKCkNCg0KZ3BfaGlzdCA8LSBnZ3Bsb3QoDQogIGRhdGEgPSBTVElNX1JFU1VMVFMgJT4lDQogICAgZHBseXI6OmZpbHRlcigNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzID4gUFNUSF9yYW5nZVsxXSwNCiAgICAgIGZpcnN0X2FwX3JlbHRpbWVzIDwgUFNUSF9yYW5nZVsyXSwNCiAgICAgIGZyZXEgPT0gZnJlcV90b19wbG90DQogICAgICAjIGFuaW1hbF9pZCA9PSAiR0lJXzIxIg0KICAgICksDQogIG1hcHBpbmcgPSBhZXMoeCA9IGZpcnN0X2FwX3JlbHRpbWVzKQ0KKSArDQogIHhsaW0oUFNUSF9yYW5nZVsxXSwgUFNUSF9yYW5nZVsyXSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoZmlsbCA9IGFuaW1hbF9pZCksIGJpbndpZHRoID0gMC4wMDEpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIoDQogICAgcGFsZXR0ZSA9ICJTZXQzIiwNCiAgICBuYW1lID0gIkFuaW1hbCINCiAgICAjIGd1aWRlID0gRkFMU0UNCiAgKSArDQogIGZhY2V0X3dyYXAofmFuaW1hbF9pZCwgbmNvbCA9IDMpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKw0KICB4bGFiKCJUaW1lIChzKSIpICsNCiAgeWxhYigiQ291bnQiKQ0KDQoNCg0KIyMjIGxpbmVzDQpncF9oaXN0ICsNCiAgIyMjIG1lZGlhbg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoDQogICAgICB4ID0gbWVkaWFuLA0KICAgICAgeGVuZCA9IG1lZGlhbiwNCiAgICAgIHkgPSB5X21heCArIDcsDQogICAgICB5ZW5kID0geV9tYXggKyAxOA0KICAgICksDQogICAgc2l6ZSA9IDENCiAgKSArDQoNCiAgIyMjIGRhdGEgcmFuZ2UNCiAgZ2VvbV9zZWdtZW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKA0KICAgICAgeCA9IHF1YW50aWxlMjUgLSAxLjUgKiBJUVIsDQogICAgICB4ZW5kID0gcXVhbnRpbGUyNSwNCiAgICAgIHkgPSB5X21heCArIDEyLjUsDQogICAgICB5ZW5kID0geV9tYXggKyAxMi41DQogICAgKQ0KICApICsNCg0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHF1YW50aWxlNzUsIHhlbmQgPSBxdWFudGlsZTc1ICsgMS41ICogSVFSLCB5ID0geV9tYXggKyAxMi41LCB5ZW5kID0geV9tYXggKyAxMi41KQ0KICApICsNCg0KICAjIyMgSVFSIChib3gpDQogIGdlb21fcmVjdCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4bWluID0gcXVhbnRpbGUyNSwgeG1heCA9IHF1YW50aWxlNzUsIHltaW4gPSB5X21heCArIDcsIHltYXggPSB5X21heCArIDE4KSwNCiAgICBjb2xvciA9ICJyZWQiLA0KICAgIGFscGhhID0gMCwNCiAgICBpbmhlcml0LmFlcyA9IEYNCiAgKSArDQoNCiAgIyMjIG1lYW4NCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gbWVhbiwgeSA9IHlfbWF4ICsgNCksIHNpemUgPSAyDQogICkgKw0KDQogICMjIyBwZWFrDQogIGdlb21fcG9pbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBlYWssIHkgPSB5X21heCArIDQpLA0KICAgIHNoYXBlID0gMjUsDQogICAgc2l6ZSA9IDIsDQogICAgZmlsbCA9ICJyZWQiDQogICkNCmBgYA0KDQojIyMgUFNUSCBAIDIwIEh6IGNvcnRpY2FsIGFjdGl2YXRpb24NCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgbWFpbiBwbG90DQoNCiMjIyBzZXQgUFNUSCByYW5nZTogc2VlIGVhcmxpZXIgKGNhbGN1bGF0aW5nIGhpc3Qgc3RhdHMgY2h1bmspDQoNCiMjIyBzZWxlY3QgZnJlcXVlbmN5IHRvIHBsb3QgKDEsIDgsIDE4KQ0KZnJlcV90b19wbG90IDwtIDE4ICU+JSBhcy5jaGFyYWN0ZXIoKQ0KDQpncF9oaXN0IDwtIGdncGxvdCgNCiAgZGF0YSA9IFNUSU1fUkVTVUxUUyAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPiBQU1RIX3JhbmdlWzFdLA0KICAgICAgZmlyc3RfYXBfcmVsdGltZXMgPCBQU1RIX3JhbmdlWzJdLA0KICAgICAgZnJlcSA9PSBmcmVxX3RvX3Bsb3QNCiAgICAgICMgYW5pbWFsX2lkID09ICJHSUlfMjEiDQogICAgKSwNCiAgbWFwcGluZyA9IGFlcyh4ID0gZmlyc3RfYXBfcmVsdGltZXMpDQopICsNCiAgeGxpbShQU1RIX3JhbmdlWzFdLCBQU1RIX3JhbmdlWzJdKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsID0gYW5pbWFsX2lkKSwgYmlud2lkdGggPSAwLjAwMSkgKw0KICBzY2FsZV9maWxsX2JyZXdlcigNCiAgICBwYWxldHRlID0gIlNldDMiLA0KICAgIG5hbWUgPSAiQW5pbWFsIg0KICAgICMgZ3VpZGUgPSBGQUxTRQ0KICApICsNCiAgZmFjZXRfd3JhcCh+YW5pbWFsX2lkLCBuY29sID0gMykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArDQogIHhsYWIoIlRpbWUgKHMpIikgKw0KICB5bGFiKCJDb3VudCIpDQoNCg0KDQojIyMgbGluZXMNCmdwX2hpc3QgKw0KICAjIyMgbWVkaWFuDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcygNCiAgICAgIHggPSBtZWRpYW4sDQogICAgICB4ZW5kID0gbWVkaWFuLA0KICAgICAgeSA9IHlfbWF4ICsgNywNCiAgICAgIHllbmQgPSB5X21heCArIDE4DQogICAgKSwNCiAgICBzaXplID0gMQ0KICApICsNCg0KICAjIyMgZGF0YSByYW5nZQ0KICBnZW9tX3NlZ21lbnQoDQogICAgZGF0YSA9IGhpc3Rfc3RhdHMgJT4lDQogICAgICBkcGx5cjo6ZmlsdGVyKGZyZXEgPT0gZnJlcV90b19wbG90KSAlPiUNCiAgICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQpLA0KICAgIG1hcHBpbmcgPSBhZXMoDQogICAgICB4ID0gcXVhbnRpbGUyNSAtIDEuNSAqIElRUiwNCiAgICAgIHhlbmQgPSBxdWFudGlsZTI1LA0KICAgICAgeSA9IHlfbWF4ICsgMTIuNSwNCiAgICAgIHllbmQgPSB5X21heCArIDEyLjUNCiAgICApDQogICkgKw0KDQogIGdlb21fc2VnbWVudCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gcXVhbnRpbGU3NSwgeGVuZCA9IHF1YW50aWxlNzUgKyAxLjUgKiBJUVIsIHkgPSB5X21heCArIDEyLjUsIHllbmQgPSB5X21heCArIDEyLjUpDQogICkgKw0KDQogICMjIyBJUVIgKGJveCkNCiAgZ2VvbV9yZWN0KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHhtaW4gPSBxdWFudGlsZTI1LCB4bWF4ID0gcXVhbnRpbGU3NSwgeW1pbiA9IHlfbWF4ICsgNywgeW1heCA9IHlfbWF4ICsgMTgpLA0KICAgIGNvbG9yID0gInJlZCIsDQogICAgYWxwaGEgPSAwLA0KICAgIGluaGVyaXQuYWVzID0gRg0KICApICsNCg0KICAjIyMgbWVhbg0KICBnZW9tX3BvaW50KA0KICAgIGRhdGEgPSBoaXN0X3N0YXRzICU+JQ0KICAgICAgZHBseXI6OmZpbHRlcihmcmVxID09IGZyZXFfdG9fcGxvdCkgJT4lDQogICAgICBkcGx5cjo6Z3JvdXBfYnkoYW5pbWFsX2lkKSwNCiAgICBtYXBwaW5nID0gYWVzKHggPSBtZWFuLCB5ID0geV9tYXggKyA0KSwgc2l6ZSA9IDINCiAgKSArDQoNCiAgIyMjIHBlYWsNCiAgZ2VvbV9wb2ludCgNCiAgICBkYXRhID0gaGlzdF9zdGF0cyAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoZnJlcSA9PSBmcmVxX3RvX3Bsb3QpICU+JQ0KICAgICAgZHBseXI6Omdyb3VwX2J5KGFuaW1hbF9pZCksDQogICAgbWFwcGluZyA9IGFlcyh4ID0gcGVhaywgeSA9IHlfbWF4ICsgNCksDQogICAgc2hhcGUgPSAyNSwNCiAgICBzaXplID0gMiwNCiAgICBmaWxsID0gInJlZCINCiAgKQ0KYGBgDQoNCg0KIyMjIFJlc3BvbnNlIHByb2JhYmlsaXR5IGFuZCBsYXRlbmN5DQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBSRVNQX1BST0IgJT4lDQogICAgZHBseXI6OmZpbHRlcihhbmltYWxfaWQgIT0gIkdJSV8yMCIpLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBhcy5mYWN0b3Ioc3RpbV9mcmVxKSwNCiAgICB5ID0gcmVzcF9wcm9iX3JhbmdlDQogICkNCikgKw0KICBnZW9tX3BvaW50KA0KICAgIGFlcyhmaWxsID0gYW5pbWFsX2lkKSwNCiAgICBjb2xvciA9ICJibGFjayIsDQogICAgc2l6ZSA9IDMsDQogICAgc2hhcGUgPSAyMSwNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjEpDQogICkgKw0KICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBhbmltYWxfaWQpKSArDQogIGdlb21fYm94cGxvdChhbHBoYSA9IDAsIHdpZHRoID0gMC4yLCBsd2QgPSAxLCBmYXR0ZW4gPSAxLjIpICsNCiAgeGxhYigiU3RpbXVsdXMgZnJlcXVlbmN5IikgKw0KICB5bGFiKCJSZXNwb25zZSBwcm9iYWJpbGl0eSIpICsNCiAgZ2VvbV9zaWduaWYoDQogICAgY29tcGFyaXNvbnMgPSBsaXN0KGMoIjEiLCAiMTAiKSksDQogICAgbWFwX3NpZ25pZl9sZXZlbCA9IFRSVUUsDQogICAgdGVzdCA9ICJtb29kLnRlc3QiDQogICkgKw0KICBnZW9tX3NpZ25pZigNCiAgICBjb21wYXJpc29ucyA9IGxpc3QoYygiMTAiLCAiMjAiKSksDQogICAgbWFwX3NpZ25pZl9sZXZlbCA9IFRSVUUsDQogICAgdGVzdCA9ICJtb29kLnRlc3QiDQogICkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFJFU1BfUFJPQiAlPiUNCiAgICBnYXRoZXIoDQogICAgICBrZXkgPSAibGF0ZW5jeV90eXBlIiwNCiAgICAgIHZhbHVlID0gImxhdGVuY3lfdmFsdWUiLA0KICAgICAgcGVha19sYXRlbmN5LA0KICAgICAgbWVhbl9sYXRlbmN5DQogICAgKSAlPiUNCiAgICBkcGx5cjo6ZmlsdGVyKGFuaW1hbF9pZCAhPSAiR0lJXzIwIiksDQogIG1hcHBpbmcgPSBhZXMoDQogICAgeCA9IGFzLmZhY3RvcihzdGltX2ZyZXEpLA0KICAgIHkgPSBsYXRlbmN5X3ZhbHVlICogMTAwMA0KICApDQopICsNCiAgIyMjIGRhdGEgdmlzdWFsaXphdGlvbiBsYXllcnMNCiAgZ2VvbV9wb2ludCgNCiAgICBhZXMoY29sb3IgPSBsYXRlbmN5X3R5cGUpLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC40KSwNCiAgICBzaXplID0gMw0KICApICsNCiAgZ2VvbV9ib3hwbG90KA0KICAgIGFlcyhjb2xvciA9IGxhdGVuY3lfdHlwZSksDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjQpLA0KICAgIHdpZHRoID0gMC4zLA0KICAgIGFscGhhID0gMCwNCiAgICBsd2QgPSAxLA0KICAgIGZhdHRlbiA9IDEuMg0KICApICsNCiAgeWxpbSgwLCAyNSkgKw0KICB4bGFiKCJTdGltdWx1cyBmcmVxdWVuY3kiKSArDQogIHlsYWIoIlBlYWsgbGF0ZW5jeSIpICsNCiAgc2NhbGVfY29sb3JfZGlzY3JldGUoDQogICAgbmFtZSA9ICJMYXRlbmN5IiwNCiAgICBicmVha3MgPSBjKCJtZWFuX2xhdGVuY3kiLCAicGVha19sYXRlbmN5IiksDQogICAgbGFiZWxzID0gYygiTWVhbiIsICJQZWFrIikNCiAgKQ0KYGBgDQoNCg0KIyMjIE51bWJlciBvZiBBUHMgYWZ0ZXIgZWFjaCBzdGltdWx1cyBpbiBzdGltdWx1cyB0cmFpbnMgKDUwIG1zIHdpbmRvdykNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBBUEMgJT4lDQogICAgZHBseXI6OmZpbHRlcihzdGltX2ZyZXFfY2F0ZWcgJWluJSBjKCIxIiwgIjEwIiwgIjIwIiksIHN0aW1fbnVtYmVyIDwgMTEpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQsIHN0aW1fZnJlcV9jYXRlZywgc3RpbV9udW1iZXIpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpc2UoTm9fQVBzID0gc3VtKE5vX0FQcykpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBkcGx5cjo6Z3JvdXBfYnkoc3RpbV9mcmVxX2NhdGVnLCBzdGltX251bWJlcikgJT4lDQogICAgZHBseXI6OnN1bW1hcmlzZSgNCiAgICAgIE5vX0FQX21lYW4gPSBtZWFuKE5vX0FQcyksDQogICAgICBOb19BUF9zZCA9IHNkKE5vX0FQcyksDQogICAgICBTRU0gPSBzZChOb19BUHMpIC8gc3FydChsZW5ndGgoTm9fQVBzKSkNCiAgICApLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBzdGltX251bWJlciwNCiAgICB5ID0gTm9fQVBfbWVhbiwNCiAgICBjb2xvdXIgPSBhcy5mYWN0b3Ioc3RpbV9mcmVxX2NhdGVnKSwNCiAgICBncm91cCA9IGFzLmZhY3RvcihzdGltX2ZyZXFfY2F0ZWcpDQogICkNCikgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2xpbmUoKSArDQogIHhsYWIoIk5vLiBzdGltdWx1cyBpbiB0cmFpbiIpICsNCiAgeWxhYigiTWVhbiBuby4gQVBzIGFjY3Jvc3MgYW5pbWFscyIpICsNCiAgbGFicyhjb2xvciA9ICJGcmVxdWVuY3kiKSArDQogIHlsaW0oMCwgMTgpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBhcy5jaGFyYWN0ZXIoYygxOjEwKSkpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoDQogIGRhdGEgPSBBUEMgJT4lDQogICAgZHBseXI6OmZpbHRlcihzdGltX2ZyZXFfY2F0ZWcgJWluJSBjKCIxIiwgIjEwIiwgIjIwIiksIHN0aW1fbnVtYmVyIDwgMTEpICU+JQ0KICAgIGRwbHlyOjpncm91cF9ieShhbmltYWxfaWQsIHN0aW1fZnJlcV9jYXRlZywgc3RpbV9udW1iZXIpICU+JQ0KICAgIGRwbHlyOjpzdW1tYXJpc2UoTm9fQVBzID0gc3VtKE5vX0FQcykpLA0KICBtYXBwaW5nID0gYWVzKA0KICAgIHggPSBzdGltX251bWJlciwNCiAgICB5ID0gTm9fQVBzLA0KICAgIGNvbG9yID0gYXMuZmFjdG9yKGFuaW1hbF9pZCksDQogICAgbGluZXR5cGUgPSBhcy5mYWN0b3IoYW5pbWFsX2lkKQ0KICApDQopICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoMToxMCksIGJyZWFrcyA9IGMoMToxMCkpICsNCiAgZ2VvbV9sYWJlbF9yZXBlbCgNCiAgICBkYXRhID0gLiAlPiUNCiAgICAgIGRwbHlyOjpmaWx0ZXIoc3RpbV9udW1iZXIgPT0gMTApLA0KICAgIGFlcyhsYWJlbCA9IGFuaW1hbF9pZCksDQogICAgZGlyZWN0aW9uID0gInkiLA0KICAgIGhqdXN0ID0gLTINCiAgKSArDQogIGV4cGFuZF9saW1pdHMoeCA9IDEyKSArDQoNCiAgIyB4bGltKDEsMTApICsNCiAgZmFjZXRfd3JhcCh+c3RpbV9mcmVxX2NhdGVnKSArDQogIGxhYnMobGluZXR5cGUgPSAiQW5pbWFscyIsIGNvbG9yID0gIkFuaW1hbHMiKSArDQogIHhsYWIoIk5vLiBzdGltdWx1cyBpbiB0cmFpbiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIEFQcyIpDQpgYGANCg0KDQoNCiMgU3BvbnRhbmVvdXMgZGVzeW5jaHJvbml6YXRpb24gb2YgdGhlIEZDIHNsb3cgb3NjaWxsYXRpb24gDQoNCiMjIExvYWRpbmcgZGF0YSANCg0KTG9hZGluZyBtYXQgZmlsZXMgdG8gKmZpbGVfbGlzdCogb2JqZWN0DQoNCmBgYHtyLCAgZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpmaWxlX2xpc3QgPC0gbGlzdC5maWxlcygNCiAgcGF0aCA9ICJkYXRhIiwNCiAgcGF0dGVybiA9ICIqLm1hdCIsIGZ1bGwubmFtZXMgPSBGLCByZWN1cnNpdmUgPSBGDQopDQoNCmBgYA0KDQpDb250ZW50IG9mIG1hdCBmaWxlczoNCg0KKiBBUCBjaGFubmVsDQogICsgKip0aXRsZToqKiBjaGFubmVsIG5hbWUNCiAgKyAqKmNvbW1lbnQ6Kiogbm90ZXMgYWJvdXQgdGhlIGNoYW5uZWwNCiAgKyAqKnJlc29sdXRpb246KiogMi41ZS0wNg0KICArICoqaW50ZXJ2YWw6KiogdGltZSBiZXR3ZWVuIHR3byBkYXRhIHBvaW50cyBpbiBzZWMgKDVlLTA1KQ0KICArICoqc2NhbGU6Kiogc2NhbGluZyBmYWN0b3IgKHkgc2NhbGUpLCByZWFsID0gKGRhdGEgKiBzY2FsZSkgKyBvZmZzZXQNCiAgKyAqKm9mZnNldDoqKiBzY2FsZSBvZmZzZXQNCiAgKyAqKnVuaXRzOioqIHVuaXQgb2YgdGhlIGNoYW5uZWwgKHZvbHQpDQogICsgKipsZW5ndGg6KiogbnVtYmVyIG9mIEFQcw0KICArICoqaXRlbXM6KiogTm8uIHBvaW50cyBlYXNjaCBBUCBpcyByZXByZXNlbnRlZCBieQ0KICArICoqdHJpZ2dlcjoqKg0KICArICoqdHJhY2VzOioqDQogICsgKip0aW1lczoqKiB0aW1lcyBvZiB0aGUgQVBzIChmaXJzdCBkYXRhIHBvaW50IG9mIHRoZSB3YXZlZm9ybSkNCiAgKyAqKmNvZGVzOioqIG1hcmtlciBjb2RlcyBvZiB0aGUgQVBzDQogICsgKip2YWx1ZXM6KiogbWF0cml4IGNvbnRhaW5pbmcgdGhlIHdhdmVmb3JtcyBvZiB0aGUgQVBzIChkZXNjcmliZWQgYnkgYSBnaXZlbiBOby4gcG9pbnRzKQ0KIA0KKiBFRUcgY2hhbm5lbA0KICArICoqdGl0bGU6KiogY2hhbm5lbCBuYW1lDQogICsgKipjb21tZW50OioqDQogICsgKippbnRlcnZhbDoqKg0KICArICoqc2NhbGU6Kiogc2NhbGluZyBmYWN0b3IgKHkgc2NhbGUpLCByZWFsID0gKGRhdGEgKiBzY2FsZSkgKyBvZmZzZXQNCiAgKyAqKm9mZnNldDoqKiBzY2FsZSBvZmZzZXQNCiAgKyAqKnVuaXRzOioqDQogICsgKipzdGFydDoqKg0KICArICoqbGVuZ3RoOioqDQogICsgKip2YWx1ZXM6KioNCg0KYGBge3J9DQpmaWxlX3RvX2xvYWQgPC0gZmlsZV9saXN0W1sxXV0NCmZpbGVuYW1lIDwtIGFzLmNoYXJhY3RlcihzdWJzdHJpbmcoZmlsZV90b19sb2FkLCAxLCBuY2hhcihmaWxlX3RvX2xvYWQpIC0gNCkpDQpyYXcucmVjIDwtIHJlYWRNYXQoZmlsZS5wYXRoKCJkYXRhIiwgZmlsZV90b19sb2FkKSkNCg0KIyMjIHRha2VzIHRoZSBmaXJzdCBBUCAoZmlyc3Qgcm93KSBhbmQgdGVsbHMgdGhlIGluZGV4IG9mIHBvaW50IHdpdGggdGhlIG1heCB2YWx1ZQ0KcG9pbnRzX3RvX3BlYWsgPC0gd2hpY2gocmF3LnJlYyRhcFssICwgMV0kdmFsdWVzWzEsIF0gPT0NCiAgbWF4KHJhdy5yZWMkYXBbLCAsIDFdJHZhbHVlc1sxLCBdKSkgJT4lDQogIGFzLm51bWVyaWMoKQ0KDQojIyMgdGltZSBvZiB0aGUgcGVhayBvZiB0aGUgQVBzIGFmdGVyIGl0cyBmaXJzdCBwb2ludA0KcmF3LnJlYyRhcFssICwgMV0kaW50ZXJ2YWwgKiBwb2ludHNfdG9fcGVhaw0KDQphcCA8LSByYXcucmVjJGFwWywgLCAxXSR0aW1lcyAlPiUgYXMuZG91YmxlKCkNCmFwX3BlYWtzIDwtIHRpYmJsZShwZWFrX3RpbWVzID0gKGFwICsgYyhyYXcucmVjJGFwWywgLCAxXSRpbnRlcnZhbCAqIHBvaW50c190b19wZWFrKSkpDQpgYGANCg0KDQotLS0tLS0tIGluc2VydCBjb2RlIGhlcmUgLS0tLS0tLS0NCiANCihzcG9udF9kZXN5bmNocm9uX2FuYWx5c2lzLlIpLCA3IHJlY29yZGluZ3MNCg0KIyBUZXJtaW5hbHMNCg0KIyMgTG9hZGluZyBkYXRhDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHRpZHk9VFJVRX0NCmZpbGVfcGF0aCA8LSBmaWxlLnBhdGgoDQogICJkYXRhIiwNCiAgIkVtaV90ZXJtaW5hbHMiLA0KICAidGVybWluYWxfbWVhc3VyZXMuY3N2Ig0KKQ0KVEVSTUlOQUxTIDwtIHJlYWQudGFibGUoZmlsZSA9IGZpbGVfcGF0aCwgc2VwID0gIjsiLCBoZWFkZXIgPSBULCBuYS5zdHJpbmcgPSAibmEiKQ0KaGVhZChURVJNSU5BTFMpDQpgYGANCg0KIyMgQm91dG9uIGFyZWEgb24gZGlmZmVyZW50IGRlbmRyaXRpYyBkb21haW5zDQoNCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdChkYXRhID0gVEVSTUlOQUxTLCBtYXBwaW5nID0gYWVzKHggPSBwb3N0aW9uLCB5ID0gYl9hcmVhKSkgKw0KICBnZW9tX2hhbGZfdmlvbGluKA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeCA9IC0uMTUpLA0KICAgIHRyaW0gPSBGLA0KICAgIHNpZGUgPSAibCIsDQogICAgc2NhbGUgPSAiYXJlYSIsDQogICAgZHJhd19xdWFudGlsZXMgPSBjKDAuNSksDQogICAgYWVzKGZpbGwgPSBwb3N0aW9uKQ0KICApICsNCiAgZ2VvbV9qaXR0ZXIocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4xKSkNCmBgYA0KDQojIyBBcmVhIG9mIGJvdXRvbnMgd2l0aCAqbTIqIGFuZCAqdW5rbm93biogb3JpZ2luDQoNCmBgYHtyIGZpZy53aWR0aD0xMCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdncGxvdCgNCiAgZGF0YSA9IFRFUk1JTkFMUywNCiAgbWFwcGluZyA9IGFlcyh4ID0gb3JpZ2luLCB5ID0gYl9hcmVhKQ0KKSArDQogIGdlb21faGFsZl92aW9saW4oDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh4ID0gLS4xNSksDQogICAgdHJpbSA9IEYsDQogICAgc2lkZSA9ICJsIiwNCiAgICBzY2FsZSA9ICJjb3VudCIsDQogICAgZHJhd19xdWFudGlsZXMgPSBjKDAuNSkNCiAgICAjIGZpbGwgPSBhbHBoYSgwLjEpLA0KICAgICMgYWVzKGNvbCA9IHBvc3Rpb24pDQogICkgKw0KICBnZW9tX2ppdHRlcigNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjEpLA0KICAgIGFlcyhjb2wgPSBwb3N0aW9uKQ0KICApICsNCiAgYW5ub3RhdGUoInRleHQiLA0KICAgIHggPSAwLjcsDQogICAgeSA9IDEsDQogICAgbGFiZWwgPSBwYXN0ZSgNCiAgICAgICJuID0gIiwNCiAgICAgIFRFUk1JTkFMUyAlPiUNCiAgICAgICAgZHBseXI6Omdyb3VwX2J5KG9yaWdpbikgJT4lDQogICAgICAgIGRwbHlyOjpzdW1tYXJpc2UobiA9IGxlbmd0aChiX2FyZWEpKSAlPiUNCiAgICAgICAgZHBseXI6OmZpbHRlcihvcmlnaW4gPT0gIm0yIikgJT4lDQogICAgICAgIHNlbGVjdChuKSAlPiUNCiAgICAgICAgYXMuY2hhcmFjdGVyKCkNCiAgICApDQogICkgKw0KICBhbm5vdGF0ZSgidGV4dCIsDQogICAgeCA9IDEuNiwNCiAgICB5ID0gMSwNCiAgICBsYWJlbCA9IHBhc3RlKA0KICAgICAgIm4gPSAiLA0KICAgICAgVEVSTUlOQUxTICU+JQ0KICAgICAgICBkcGx5cjo6Z3JvdXBfYnkob3JpZ2luKSAlPiUNCiAgICAgICAgZHBseXI6OnN1bW1hcmlzZShuID0gbGVuZ3RoKGJfYXJlYSkpICU+JQ0KICAgICAgICBkcGx5cjo6ZmlsdGVyKG9yaWdpbiA9PSAidW5rbm93biIpICU+JQ0KICAgICAgICBzZWxlY3QobikgJT4lDQogICAgICAgIGFzLmNoYXJhY3RlcigpDQogICAgKQ0KICApDQpgYGANCg==